MySQL 的备份还原 (xtrabackup)
xtrabackup 简介
xtrabackup 是 percona 提供的 MySQL 数据库的备份工具, 是唯一开源的能对 innodb 和 xtradb 数据库进行热备的工具
xtrabackup 的特点
1. 备份还原过程快, 可靠
2. 备份过程不会打断正在执行的事务
3. 能够基于压缩等功能介于磁盘空间和流量
4. 自动实现备份检验
5. 开源免费
xtrabackup 备份过程
xtrabackup 安装
xtrabackup 在 CentOS 的 EPEL 源中, 可以在配置完 EPEL 源后使用 yum 安装
[root@localhost ~]# yum install -y percona-xtrabackup
也可以去官网下载最新版本的 xtrabackup
xtrabackup 使用
xtrabackup [option] BACKUP-ROOT-DIR选项说明--user备份时连接到 MySQL 的账号
--password备份时连接到 MySQL 所使用的账号的密码
--host备份数据库的地址
--databases所要备份的数据库名,如果有多个数据库可以使用 "," 隔开,如果备份表则使用 "DATABASE.TABLE" 来指明
--incremental表示创建一个增量备份
--incremental-basedir指定前一次完全备份或者增量备份的目录
--incremental-dir指定还原时增量备份的目录
--apply-log备份完成后的数据不能直接用于恢复操作,因为备份的数据中可能包含尚未提交的事务或已经提交但尚未同步的至数据库中过的事务,此时数据仍处于不一致状态,此选项作用是通过回滚提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态
--apply-log-only恢复时阻止回滚未完成的事务,在有增量备份时使用
--export开启可导出单独的表之后再导入其他 MySQL 中
--redo-only合并增量备份时使用,不包括最后一个增量备份的合并
--copy-back做数据恢复时将备份数据文件拷贝到 MySQL 服务器的 datadir
--move-back作用和 copy-back 想用区别在于此选项是用来移动备份的数据
xtrabackup 完全, 增量备份及还原
完全备份及还原
在完全备份之前需要创建一个备份的目录作为存放备份使用
[root@localhost ~]# mkdir /data/backup
数据库内存放的数据[root@localhost~]#MySQL-e'SHOW DATABASES;'
+--------------------+
|Database|
+--------------------+
|hellodb|
|information_schema|
|MySQL|
|performance_schema|
|test|
+--------------------+
一, 完全备份
[root@localhost ~]# mariabackup --backup --target-dir=/data/backup --user=root --password=''
二, 对数据库破坏
[root@localhost ~]# rm -rf /data/MySQL/*
三, 恢复
3.1 在恢复数据库前需要先将数据库内数据清理, 然后停止 MySQL 服务[root@localhost~]#rm-rf/data/MySQL/*
[root@localhost ~]# service mysqld stop
Stopping mysqld (via systemctl): [ OK ]
3.2 对备份目录做整理
[root@localhost ~]# mariabackup --prepare --target-dir=/data/backup
3.3 将整理好的备份数据还原至数据库
[root@localhost ~]# mariabackup --copy-back --target-dir=/data/backup
3.4 此时还原回去的数据属性还有问题, 需要将其修改[root@localhost~]#ll/data/MySQL/
total12320
-rw-r-----1root root16384May621:28aria_log.00000001
-rw-r-----1root root52May621:28aria_log_control
drwx------2root root272May621:28hellodb
-rw-r-----1root root942May621:28ib_buffer_pool
-rw-r-----1root root12582912May621:28ibdata1
drwx------2root root4096May621:28MySQL
drwx------2root root20May621:28performance_schema
drwx------2root root20May621:28test
-rw-r-----1root root527May621:28xtrabackup_info
[root@localhost~]#chown-RMySQL.MySQL/data/MySQL/
四, 启动服务测试[root@localhost~]#service mysqld start
Startingmysqld(via systemctl):[OK]
[root@localhost~]#MySQL-e"SHOW DATABASES;SHOW TABLES FROM hellodb;"
+--------------------+
|Database|
+--------------------+
|hellodb|
|information_schema|
|MySQL|
|performance_schema|
|test|
+--------------------+
+-------------------+
|Tables_in_hellodb|
+-------------------+
|classes|
|coc|
|courses|
|scores|
|students|
|teachers|
|toc|
+-------------------+
完全备份 + 增量备份及还原
在备份之前先创建出完全备份的目录以及增量备份的目录[root@localhost~]#mkdir-pv/dataa/backup/{
full,inc1,inc2
}
mkdir:created directory'/data/backup'
mkdir:created directory'/data/backup/full'
mkdir:created directory'/data/backup/inc1'
mkdir:created directory'/data/backup/inc2'
数据库内所存放的数据[root@localhost~]#MySQL-e'SHOW DATABASES;'
+--------------------+
|Database|
+--------------------+
|hellodb|
|information_schema|
|MySQL|
|performance_schema|
|test|
+--------------------+
一, 对数据进行完全备份
[root@localhost ~]# mariabackup --backup --target-dir=/data/backup/full --user=root --password=''
二, 此时数据库内数据发生变化[root@localhost~]#MySQL-e"INSERT hellodb.teachers VALUE(5,'Li Xiaolong',30,'M');"
[root@localhost~]#MySQL-e"SELECT * FROM hellodb.teachers WHERE tid>4;"
+-----+-------------+-----+--------+
|TID|Name|Age|Gender|
+-----+-------------+-----+--------+
|5|LiXiaolong|30|M|
+-----+-------------+-----+--------+
三, 对数据库进行增量备份
[root@localhost ~]# mariabackup --user=root --password='' --backup --incremental-basedir=/data/backup/full --target-dir=/data/backup/inc1
四, 数据库内数据再次发生变化[root@localhost~]#MySQL-e"INSERT hellodb.students(stuid,age,name) VALUE (26,35,'Sun Wukong');"
[root@localhost~]#MySQL-e"SELECT * FROM hellodb.students WHERE stuid>25;"
+-------+------------+-----+--------+---------+-----------+
|StuID|Name|Age|Gender|ClassID|TeacherID|
+-------+------------+-----+--------+---------+-----------+
|26|SunWukong|35|F|NULL|NULL|
+-------+------------+-----+--------+---------+-----------+
五, 再次对数据库做增量备份
[root@localhost ~]# mariabackup --user=root --password='' --backup --incremental-basedir=/data/backup/inc1 --target-dir=/data/backup/inc2
六, 破坏数据库
[root@localhost ~]# rm -rf /data/MySQL/*
七, 恢复数据库
7.1 先对数据库做清理, 并停止数据库服务[root@localhost~]#rm-rf/data/MySQL/*
[root@localhost ~]# service mysqld stop
Stopping mysqld (via systemctl): [ OK ]
7.2 对完全备份做预整理
因为后续还有增量备份, 所以此处需要使用 apply-log-only 选项来阻止事务的回滚.
[root@localhost ~]# mariabackup --prepare --apply-log-only --target-dir=/data/backup/full
7.3 合并第一次的增量备份
此为第一个增量备份后续还有第二个增量所以需要使用 apply-log-only 阻止回滚事务
[root@localhost backup]# mariabackup --prepare --apply-log-only --target-dir=/data/backup/full --incremental-dir=/data/backup/inc1
7.3 合并第二次的增量备份
此为最后个增量备份无需再使用 apply-log-only 阻止回滚事务
[root@localhost backup]# mariabackup --prepare --target-dir=/data/backup/full --incremental-dir=/data/backup/inc2
7.4 整理完毕将备份复制回数据库
[root@localhost backup]# mariabackup --copy-back --target-dir=/data/backup/full
7.5 将数据库内的属主和属组进行更改
[root@localhost backup]# chown -R MySQL.MySQL /data/MySQL/
八, 重启服务测试[root@localhost backup]#service mysqld start
Startingmysqld(via systemctl):[OK]
[root@localhost backup]#msyql
MariaDB[hellodb]>select*fromstudentswherestuid>25;
+-------+------------+-----+--------+---------+-----------+
|StuID|Name|Age|Gender|ClassID|TeacherID|
+-------+------------+-----+--------+---------+-----------+
|26|SunWukong|35|F|NULL|NULL|
+-------+------------+-----+--------+---------+-----------+
1rowinset(0.00sec)
MariaDB[hellodb]>select*fromteacherswheretid>4;
+-----+-------------+-----+--------+
|TID|Name|Age|Gender|
+-----+-------------+-----+--------+
|5|LiXiaolong|30|M|
+-----+-------------+-----+--------+
1rowinset(0.00sec)
其他的注意事项
1. 在数据恢复之前必须先要停止 MySQL 服务
2. 在还原时 MySQL 的数据库目录必须为空, 否则不会覆盖
3. 数据库内容还原后, 其属主和属组为 root 需要手动将其全部改为 MySQL
来源: http://blog.51cto.com/11886307/2389857