Edit
目录
xtrabackup 备份机制
Full Backups
Create a Backup
备份命令
xtrabackup--backup--target-dir=/Directory
如果InnoDB data 或者 log file不储存在同目录下,需要专门指定数据位置
如果目的文件夹不存在,xtrabackup会自动创建,如果目录存在并且为空,xtrabacup则执行成功。xtrabackup不会覆盖已经存在的文件 ,文件存在则会返回系统error : syserror error 17。
如果指定是的相对目录,则目的文件夹从当前目录开始。
备份过程中会有很多输出显示 数据文件的拷贝过程,
最后输出范例:
160906 10:19:17 Finished backing up non-InnoDB tables and files
160906 10:19:17 Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS...
xtrabackup: The latest check point (for incremental): '62988944'
xtrabackup: Stopping log copying thread.
160906 10:19:18 Executing UNLOCK TABLES
160906 10:19:18 All tables unlocked
160906 10:19:18 Backup created in directory '/data/backups/'
160906 10:19:18 [00] Writing backup-my.cnf
160906 10:19:18 [00] ...done
160906 10:19:18 [00] Writing xtrabackup_info
160906 10:19:18 [00] ...done
160906 10:19:18 completed OK!
在输出信息的最后,你会看到lsn依赖系统信息的lsn信息
xtrabackup: Transactionlogof lsn ()to() was copied.
Note
日志复制线程会时刻检查事务日志确认是否有新的需要被复制的日志记录,但是潜在风险是日志拷贝线程无法承受大并发事务日志的写入,如果旧日志被复写前检查线程没有读到也将触发错误。
备份结束后,目标文件来通常会包括如下这些文件,假设你已经有了一个单InnoDB表test.tbl1,那你的目录下通常会有这些文件 :
$ ls -lh /data/backups/
total 182M
drwx------7root root 4.0K Sep610:19 .
drwxrwxrwt 11 root root 4.0K Sep 6 11:05 ..
-rw-r----- 1 root root 387 Sep 6 10:19 backup-my.cnf
-rw-r----- 1 root root 76M Sep 6 10:19 ibdata1
drwx------2root root 4.0K Sep610:19 mysql
drwx------ 2 root root 4.0K Sep 6 10:19 performance_schema
drwx------ 2 root root 4.0K Sep 6 10:19 sbtest
drwx------ 2 root root 4.0K Sep 6 10:19 test
drwx------ 2 root root 4.0K Sep 6 10:19 world2
-rw-r----- 1 root root 116 Sep 6 10:19 xtrabackup_checkpoints
-rw-r----- 1 root root 433 Sep 6 10:19 xtrabackup_info
-rw-r-----1root root 106M Sep610:19 xtrabackup_logfile
备份时长取决于数据库容量大小,期间你可以任意停止,因为其不操作数据库。
Preparing a backup
做好备份后,这些备份要随意准备用来应对意外,随时可能被恢复。数据文件的时间点是不一致的直至他们真正被准备好,数据不一致是因为这些文件并非同时被复制,在这个拷贝的过程中程序还处于运行状态,而且拷贝后他们也随时可能会发生改变。如果我们使用提InnoDB引擎,InooDB在数据恢复前将检测脏数据然后自我销毁进程,即我们无法使用坏数据或者脏数据。--prepare该操作将保持数据的一致性,如此,才能真正用做数据恢复。
--prepare可以在任意安排有xtrabackup的主机上操作,无需在执行备份命令的服务器上操作,因此,我们可以复制备份到任意应用服务器来prepare。
Note
xtrabackup --prepare命令新版本支持向下兼容,但旧版本无法操作新版本。因此在其它机器上执行时一定要确认版本。举例:MySQL 5.0 使用 Xtrabackup 1.6版本备份, 使用xtrabackup 2.3版本进行preparing 备份是不支持,因为 MySQL 5.0的支持在 xtrabackup 2.1的时候被取消了,因此使用2.0的版本即可。
在Prepare期间,xtrabackup启动一种修改InnoDB的嵌入操作。这些变更需要禁用InnoDB的安全标准检查,比如: 日志文件大小检查。这些检查只是xtrabackup 二进制,我们不需要使用xtrabackup修改InnoDB。
prepare 使用 “embedded InnoDB”基于拷贝日志来为复制的备份修复损坏数据。命令使用很简单,只需要指定--prepare参数和要prepare的操作目录即可。
$xtrabackup--prepare--target-dir=/data/backups/
命令执行结束后,你将会看到InnoDB shutdown的信息,lsn的信息主要依赖于个人系统不同而不同。
InnoDB: Shutdown completed;logsequencenumber137345046
16090611:21:01completed OK!
如果已经做过prepare的修复操作或者无须修复,你将看到如下的类似信息。
xtrabackup:This target seems to be already prepared.
xtrabackup:notice:xtrabackup_logfile was already used to'--prepare'.
在preparing backup的过程最好不要意外中段,因为这将导致数据文件损坏,备份也将不可用。备份的有效性也会因为Prepare进程被中段而不可信。
Note
如果你还要使用以前的差量备份,你在prepareing的时候需要使用xtrabackup --apply-log-only参数,否则是无法使用差量 备份来恢复数据的。
Restoring a Backup
恢复前一定需要prepared
方便起见,xtrabackup使用 –copy-back 选项,该选项可以复制备份到服务器的数据文件 。
$ xtrabackup --copy-back--target-dir=/data/backups/
同样,也可以直接使用类型Linux下的move操作。xtrabackup --move-back
如果都不想使用,Linux下的系统命令 rsync 或者 cp都可以使用。
note
datadir的目标目录必须是空目录。操作之前MySQL服务必须处于关闭状态!!
$ rsync -avrP/data/backup/ /var/lib/mysql/
之前,也必须保持目录和恢复的文件的权限是正常的。如果不正常手动修正。
$ chown -Rmysql:mysql /var/lib/mysql
恢复完毕后,就可以启动MySQL服务了。
增量备份
备份原理
使用Innobackupex 做Local Full Backup: Create, Prepare 和 Restore
创建全备
$ innobackupex /data/backups
执行完命令后会有很多输出,看到类似如下的输出才算正常
10031302:43:07innobackupex: completed OK!
Prepare the Backup
使用 –apply-log 参数并指定全备的具体目录,为了提升速度,你可以指定 –use-memory来指定使用的内存大小
$ innobackupex --use-memory=4G --apply-log /data/backups/2010-03-13_02-42-44/
看到如下类似输出才算正常
10031302:51:02innobackupex: completed OK!
如此以来,/data/backups/2010-03-13_02-42-44 is 将被准备用于Retore。
恢复备份
stop 程序
执行innobackupex命令
innobackupex --copy-back /data/backups/2010-03-13_02-42-44/
## Use chmod to correct the permissions, if necessary!
Note
目标目录必须是空的。 innobackupex –copy-back 参数不会覆盖已经存在的文件 ,除非指定强制覆盖,nnobackupex –force-non-empty-directories 。首先MySQL的
差备
innobackupex--incremental/path/to/inc/dir--incremental-basedir=$FULLBACKUP--user=USER--password=PASSWORD
preparing 差备文件
prepare 全备文件
必须重新提交事情在每个全备文件上
innobackupex--apply-log--redo-only$FULLBACKUP--use-memory=1G--user=USER--password=PASSWORD
看到有类似如下输出时认为正常
11122501:10:12InnoDB: Shutdown completed;logsequence number91514213
prepare 差量文件
其次再应用到差备文件上。
innobackupex--apply-log--redo-only$FULLBACKUP
--incremental-dir=$INCREMENTALBACKUP
--use-memory=1G--user=DVADER--password=D4RKS1D3
全备
全备
xtrabackup--backup--target-dir=/data/backups/mysql/
prepare两次
xtrabackup --prepare --target-dir=/data/backups/mysql/
xtrabackup --prepare --target-dir=/data/backups/mysql/
第二次执行的时候要看到类似如下的输出:
In the second –prepare step, you should see InnoDB print messages similar to Log file ./ib_logfile0 did not exist: new to be created, followed by a line indicating the log file was created (creating new logs is the purpose of the second preparation).
差备
差备必须基于全备进行,所以 要先做全备
xtrabackup –backup –target-dir=/data/backups/mysql/
需要注意的是,这里一定不能运行--prepare命令
创建两次差备
Suppose the full backup is on Monday, and you will create an incremental one on Tuesday:
xtrabackup --backup --target-dir=/data/backups/inc/tue/ \
--incremental-basedir=/data/backups/mysql/
and the same policy is applied on Wednesday:
xtrabackup --backup --target-dir=/data/backups/inc/wed/ \
--incremental-basedir=/data/backups/inc/tue/
Prepare the base backup
Prepare the base backup (Monday’s backup):
xtrabackup --prepare --apply-log-only--target-dir=/data/backups/mysql/
Roll forward the base data to the first increment
Roll Monday’s data forward to the state on Tuesday:
xtrabackup --prepare --apply-log-only--target-dir=/data/backups/mysql/ \
--incremental-dir=/data/backups/inc/tue/
Roll forward again to the second increment
Roll forward again to the state on Wednesday:
xtrabackup --prepare --apply-log-only--target-dir=/data/backups/mysql/ \
--incremental-dir=/data/backups/inc/wed/
Prepare the whole backup to be ready to use
Create the new logs by preparing it:
xtrabackup --prepare --target-dir=/data/backups/mysql/
领取专属 10元无门槛券
私享最新 技术干货