zfs开源已经13年了,最近开始使用。zfs现在进入freebsd基本配置,使用方便,几条命令起来了,先准备好磁盘ad1
echo 'zfs_enable="YES"' >> /etc/rc.conf
/etc/rc.d/zfs start
echo 'daily_status_zfs_enable="YES"'>> /etc/periodic.conf
zpool create z01 ad1
zfs管理简洁得很!把数据库复制到新建的z01上面,启动数据库。每天做一个快照。查看结果:
df -h | egrep 'usr$|z01$' ; zfs list -t snapshot ; zpool status z01 ; top -no size
/dev/ada0s1f 434G 247G 152G 62% /usr
z01 433G 54G 379G 12% /z01
NAME USED AVAIL REFER MOUNTPOINT
z01/pgsql/data@t20180507 206M - 9.65G -
z01/pgsql/data@201805080820 71.0M - 9.56G -
z01/pgsql/data@20180509 70.3M - 9.56G -
pool: z01
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
z01 ONLINE 0 0 0
ada1 ONLINE 0 0 0
errors: No known data errors
last pid: 41091; load averages: 1.55, 0.77, 0.66 up 0+07:23:44 15:29:10
137 processes: 1 running, 132 sleeping, 4 zombie
Mem: 231M Active, 468M Inact, 1867M Wired, 415M Buf, 5364M Free
ARC: 964M Total, 486M MFU, 464M MRU, 414K Anon, 1995K Header, 12M Other
925M Compressed, 966M Uncompressed, 1.04:1 Ratio
Swap: 4096M Total, 4096M Free
PID USERNAME THR PRI NICE SIZE RES STATE C TIME WCPU COMMAND
1260 pgsql 1 4 0 1172M 103M select 4 0:32 0.00% postgres
1219 pgsql 1 4 0 1170M 102M select 6 0:33 0.00% postgres
1258 pgsql 1 4 0 1170M 102M select 3 0:24 0.00% postgres
1261 pgsql 1 4 0 1168M 98M select 5 0:11 0.00% postgres
1259 pgsql 1 4 0 1168M 98M select 7 0:11 0.00% postgres
1227 pgsql 1 4 0 1168M 91852K select 2 0:24 0.00% postgres
1245 pgsql 1 4 0 1168M 91500K select 7 0:26 0.00% postgres
1262 pgsql 1 4 0 1168M 75920K select 6 0:07 0.00% postgres
1266 pgsql 1 4 0 1166M 74656K select 2 0:06 0.00% postgres
1236 pgsql 1 4 0 1120M 125M select 4 21:45 0.00% postgres
平时没什么负载的时候zfs使用了900M字节作为管理和cache。
基于时间点的恢复其实是很耗时间的,如果你的基础备份每7天一次, 那么读取XLOG并执行到指定的时间点,再取出当时的数据,可能要半小时;如果你每天备份一次数据文件,而又没有使用zfs,那么备份的空间又占用很多。用zfs每天备份数据文件夹占用很少空间,从上面快照列表可以看到。
我们做一次基于时间点的恢复,克隆20180509凌晨的数据文件快照,数据恢复到2018-05-09 10:00这个时间点:
zfs clone z01/pgsql/data@20180509 z01/pgsql/datatest
cd /z01/pgsql/
cd datatest
cp ../postgresql.conf.recov_time ./postgresql.conf
cp ../recovery.conf.recov_time ./recovery.conf
cat ./recovery.conf
>restore_command='cp >/z01/pgsql/arch/%f %p || cp >/usr/local/pgsql/arch/%f %p'
>recovery_target_timeline='1'
>recovery_target_time = '2018-05-09 10:00:00+08'
rm -rf postmaster.pid
rm -rf pg_wal
mkdir pg_wal
cp -R /usr/local/pg_wal/* pg_wal/
chown -R pgsql:pgsql ../datatest
chmod -R og-rwx ../datatest
su pgsql -c "pg_ctl -D ../datatest start"
克隆数据文件夹是秒回的,执行XLOG跨越的时间段不会超过一天,既快又节省空间。后台向前滚动的事务日志:
cd /z01/pgsql/datatest/log
tail -f `ls -t | head -n 1`
2018-05-09 02:24:29 CST root@postgres [local] LOG: duration: 29474.253 ms statement: select pg_start_backup('')
2018-05-09 15:34:17 CST @ LOG: database system was interrupted; last known up at 2018-05-09 02:24:29 CST
2018-05-09 15:34:17 CST @ LOG: starting point-in-time recovery to 2018-05-09 10:00:00+08
2018-05-09 15:34:17 CST @ LOG: restored log file "000000010000001900000011" from archive
2018-05-09 15:34:18 CST @ LOG: redo starts at 19/11000028
2018-05-09 15:34:18 CST @ LOG: consistent recovery state reached at 19/1105D218
2018-05-09 15:34:18 CST @ LOG: database system is ready to accept read only connections
2018-05-09 15:34:18 CST @ LOG: restored log file "000000010000001900000012" from archive
2018-05-09 15:34:19 CST @ LOG: restored log file "000000010000001900000013" from archive
2018-05-09 15:34:20 CST @ LOG: restored log file "000000010000001900000014" from archive
2018-05-09 15:34:20 CST @ LOG: restored log file "000000010000001900000015" from archive
2018-05-09 15:34:21 CST @ LOG: restored log file "000000010000001900000016" from archive
2018-05-09 15:34:22 CST @ LOG: restored log file "000000010000001900000017" from archive
2018-05-09 15:34:22 CST @ LOG: restored log file "000000010000001900000018" from archive
2018-05-09 15:34:23 CST @ LOG: restored log file "000000010000001900000019" from archive
2018-05-09 15:34:24 CST @ LOG: recovery stopping before commit of transaction 51331481, time 2018-05-09 10:00:00.043179+08
实验结束,我们删除测试文件夹。(* ̄︶ ̄)
su pgsql -c "pg_ctl -D ../datatest -mfast stop"
zfs destroy z01/pgsql/datatest