一 理解MySQL备份与恢复
备份:存储的数据副本;原始数据,持续改变。
恢复:把副本应用到线上系统;仅能恢复至备份操作时刻的数据状态。
时间点恢复:binary logs。
为什么备份?
1.灾难恢复:硬件故障(冗余)、软件故障(bug)、自然灾害、黑客攻击、误操作、...
2.用于测试。
备份时应该注意事项:
1.能容忍最多丢失多少数据;
2.恢复数据需要在多长时间内完成;
3.需要恢复哪些数据;
4.做恢复演练:
测试备份的可用性;
增强恢复操作效率;
...
备份类型:
1.备份的数据的集范围:
完全备份和部分备份
完全备份:整个数据集;
部分备份:数据集的一部分,比如部分表;
2.完全备份、增量备份、差异备份:
完全备份
增量备份:仅备份自上一次完全备份或 增量备份以来变量的那部数据;
差异备份:仅备份自上一次完全备份以来变量的那部数据;
3.物理备份、逻辑备份:
物理备份:复制数据文件进行备份;
逻辑备份:从数据库导出数据另存在一个或多个文件中;
4.根据数据服务是否在线:
热备:读写操作均可进行的状态下所做的备份;
温备:可读但不可写状态下进行的备份;
冷备:读写操作均不可进行的状态下所做的备份。
备份需要考虑因素:
1.锁定资源多长时间?
2.备份过程的时长?
3.备份时的服务器负载?
4.恢复过程的时长?
备份策略:
1.全量+差异
2.全量+增量
3.备份手段:物理、逻辑
备份什么?
数据、二进制日志、InnoDB的事务日志、代码(存储过程、存储函数、触发器、事件调度器)、服务器的配置文件。
备份工具:
1.mysqldump:mysql服务自带的备份工具;逻辑备份工具:
完全、部分备份;
InnoDB:热备;
MyISAM:温备。
2.xtrabackup:
由Percona提供,开源工具,支持对InnoDB做热备,物理备份工具:
全量备份、部分备份;
全量备份、增量备份;
全量备份、差异备份;
备份策略:
1.完全+差异+binlog
2.完全+增量+binlog
3.备份,多久一次?
数据变化量
可用的备份存储空间
二 MySQL备份与恢复工具介绍
1.mysqldump:
逻辑备份、完全备份、部分备份;
二次封装工具:
mydumper(perl脚本)
phpMyAdmin
msyqldump Usage:
Usage: mysqldump [OPTIONS] database [tables] OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...] OR mysqldump [OPTIONS] --all-databases [OPTIONS]
选项:
MyISAM存储引擎:支持温备,备份时要锁定表:
-x, --lock-all-tables #锁定所有库的所有表,读锁 -l, --lock-tables #锁定指定库所有表
InnoDB存储引擎:支持温备和热备:
--single-transaction #创建一个事务,基于此快照执行备份;
其它选项:
-R, --routines #存储过程和存储函数; --triggers #备份触发器 -E, --events #备份调度器 --master-data[=#] 1:记录为CHANGE MASTER TO语句,此语句不被注释 2:记录为CHANGE MASTER TO语句,此语句被注释 --flush-logs #锁定表完成后,即进行日志刷新操作
示例:
[root@node1 ~]# mysqldump -hlocalhost -uroot --databases hellodb > /tmp/hellodb-$(date +%F).sql MariaDB [hellodb]> SELECT * FROM students; +-------+---------------+-----+--------+---------+-----------+ | StuID | Name | Age | Gender | ClassID | TeacherID | +-------+---------------+-----+--------+---------+-----------+ | 1 | Shi Zhongyu | 22 | M | 2 | 3 | | 2 | Shi Potian | 22 | M | 1 | 7 | | 3 | Xie Yanke | 53 | M | 2 | 16 | | 4 | Ding Dian | 32 | M | 4 | 4 | | 5 | Yu Yutong | 26 | M | 3 | 1 | | 6 | Shi Qing | 46 | M | 5 | NULL | | 7 | Xi Ren | 19 | F | 3 | NULL | | 8 | Lin Daiyu | 17 | F | 7 | NULL | | 9 | Ren Yingying | 20 | F | 6 | NULL | | 10 | Yue Lingshan | 19 | F | 3 | NULL | | 11 | Yuan Chengzhi | 23 | M | 6 | NULL | | 12 | Wen Qingqing | 19 | F | 1 | NULL | | 13 | Tian Boguang | 33 | M | 2 | NULL | | 14 | Lu Wushuang | 17 | F | 3 | NULL | | 15 | Duan Yu | 19 | M | 4 | NULL | | 16 | Xu Zhu | 21 | M | 1 | NULL | | 17 | Lin Chong | 25 | M | 4 | NULL | | 18 | Hua Rong | 23 | M | 7 | NULL | | 19 | Xue Baochai | 18 | F | 6 | NULL | | 20 | Diao Chan | 19 | F | 7 | NULL | | 21 | Huang Yueying | 22 | F | 6 | NULL | | 22 | Xiao Qiao | 20 | F | 1 | NULL | | 23 | Ma Chao | 23 | M | 4 | NULL | | 24 | Xu Xian | 27 | M | NULL | NULL | | 25 | Sun Dasheng | 100 | M | NULL | NULL | +-------+---------------+-----+--------+---------+-----------+ MariaDB [hellodb]> DELETE FROM students WHERE StuID=14; MariaDB [hellodb]> SHOW MASTER LOGS; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 489 | +------------------+-----------+ MariaDB [hellodb]> exit [root@node1 ~]# mysqldump -hlocalhost -uroot --master-data=1 --databases hellodb > /tmp/hellodb-$(date +%F).sql CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=489; (此行未被注释) [root@node1 ~]# mysqldump -hlocalhost -uroot --master-data=2 --databases hellodb > /tmp/hellodb-$(date +%F).sql -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=489; (此行被注释) [root@node1 ~]# mysqldump -hlocalhost -uroot --master-data=2 --flush-logs --single-transaction --databases hellodb > /tmp/hellodb-$(date +%F).sql MariaDB [(none)]> SHOW MASTER LOGS; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 532 | | mysql-bin.000002 | 245 | +------------------+-----------+ MariaDB [hellodb]> DELETE FROM students WHERE StuID=10; MariaDB [hellodb]> DROP DATABASE hellodb; MariaDB [(none)]> exit; [root@node1 mysql]# mysqlbinlog -j 245 mysql-bin.000002 > /tmp/hellodb.binlog.sql 备份到另一主机: [root@node1 mysql]# scp /tmp/hellodb* root@172.18.67.12:/tmp/ [root@node2 ~]# mysql < /tmp/hellodb-2017-06-03.sql [root@node2 ~]# mysql MariaDB [(none)]> use hellodb; MariaDB [hellodb]> SELECT * FROM students; +-------+---------------+-----+--------+---------+-----------+ | StuID | Name | Age | Gender | ClassID | TeacherID | +-------+---------------+-----+--------+---------+-----------+ | 1 | Shi Zhongyu | 22 | M | 2 | 3 | | 2 | Shi Potian | 22 | M | 1 | 7 | | 3 | Xie Yanke | 53 | M | 2 | 16 | | 4 | Ding Dian | 32 | M | 4 | 4 | | 5 | Yu Yutong | 26 | M | 3 | 1 | | 6 | Shi Qing | 46 | M | 5 | NULL | | 7 | Xi Ren | 19 | F | 3 | NULL | | 8 | Lin Daiyu | 17 | F | 7 | NULL | | 9 | Ren Yingying | 20 | F | 6 | NULL | | 10 | Yue Lingshan | 19 | F | 3 | NULL | | 11 | Yuan Chengzhi | 23 | M | 6 | NULL | | 12 | Wen Qingqing | 19 | F | 1 | NULL | | 13 | Tian Boguang | 33 | M | 2 | NULL | | 14 | Lu Wushuang | 17 | F | 3 | NULL | | 15 | Duan Yu | 19 | M | 4 | NULL | | 16 | Xu Zhu | 21 | M | 1 | NULL | | 17 | Lin Chong | 25 | M | 4 | NULL | | 18 | Hua Rong | 23 | M | 7 | NULL | | 19 | Xue Baochai | 18 | F | 6 | NULL | | 20 | Diao Chan | 19 | F | 7 | NULL | | 21 | Huang Yueying | 22 | F | 6 | NULL | | 22 | Xiao Qiao | 20 | F | 1 | NULL | | 23 | Ma Chao | 23 | M | 4 | NULL | | 24 | Xu Xian | 27 | M | NULL | NULL | | 25 | Sun Dasheng | 100 | M | NULL | NULL | +-------+---------------+-----+--------+---------+-----------+ MariaDB [hellodb]> exit [root@node2 ~]# mysql < /tmp/hellodb.binlog.sql [root@node2 ~]# mysql MariaDB [(none)]> use hellodb; MariaDB [hellodb]> SELECT * FROM students; +-------+---------------+-----+--------+---------+-----------+ | StuID | Name | Age | Gender | ClassID | TeacherID | +-------+---------------+-----+--------+---------+-----------+ | 1 | Shi Zhongyu | 22 | M | 2 | 3 | | 2 | Shi Potian | 22 | M | 1 | 7 | | 3 | Xie Yanke | 53 | M | 2 | 16 | | 4 | Ding Dian | 32 | M | 4 | 4 | | 5 | Yu Yutong | 26 | M | 3 | 1 | | 6 | Shi Qing | 46 | M | 5 | NULL | | 7 | Xi Ren | 19 | F | 3 | NULL | | 8 | Lin Daiyu | 17 | F | 7 | NULL | | 9 | Ren Yingying | 20 | F | 6 | NULL | | 11 | Yuan Chengzhi | 23 | M | 6 | NULL | | 12 | Wen Qingqing | 19 | F | 1 | NULL | | 13 | Tian Boguang | 33 | M | 2 | NULL | | 14 | Lu Wushuang | 17 | F | 3 | NULL | | 15 | Duan Yu | 19 | M | 4 | NULL | | 16 | Xu Zhu | 21 | M | 1 | NULL | | 17 | Lin Chong | 25 | M | 4 | NULL | | 18 | Hua Rong | 23 | M | 7 | NULL | | 19 | Xue Baochai | 18 | F | 6 | NULL | | 20 | Diao Chan | 19 | F | 7 | NULL | | 21 | Huang Yueying | 22 | F | 6 | NULL | | 22 | Xiao Qiao | 20 | F | 1 | NULL | | 23 | Ma Chao | 23 | M | 4 | NULL | | 24 | Xu Xian | 27 | M | NULL | NULL | | 25 | Sun Dasheng | 100 | M | NULL | NULL | +-------+---------------+-----+--------+---------+-----------+
实现了时间点还原,删除的第10行没被还原
注意:
(1) 脚本化、周期性进行(进行充分测试);
(2) 备份结果要另存,建议异地存储;对备份的结果做测试;
(3) 配置mysqldump使用binlog做增量备份;
2.xtrabackup:
MyISAM:温备,不支持增量备份;
InnoDB:热备,增量;
物理备份,速率快、可靠;备份完成后自动校验备份结果集是否可用;还原速度快;
Usage: [innobackupex [--defaults-file=#] --backup | innobackupex [--defaults-file=#] --prepare] [OPTIONS] The innobackupex tool is a Perl script that acts as a wrapper for the xtrabackup C program.
备份 --> 应用日志 --> 还原
完全备份:
完全+binlog(总结):
备份:innobackupex --user --password= --host= /PATH/TO/BACKUP_DIR
准备:innobackupex --apply-log /PATH/TO/BACKUP_DIR
恢复:innobackupex --copy-back
注意:--copy-back需要在mysqld主机本地进行,mysqld服务不能启动;
innodb_log_file_size可能要重新设定;
总结:完全+增量+binlog
备份:完全+增量+增量+...
完全+差异
准备:
innobackupex --apply-log --redo-only BASEDIR innobackupex --apply-log --redo-only BASEDIR --incremental-dir=INCREMENTAL-DIR
恢复:
innobackupex --copy-back BASEDIR
备份单库:
--databases
总结:
mysqldump+binlog
lvm2+cp/tar+binlog
xtrabackup(innodb)+binlog
示例:
备份:
MariaDB [hellodb]> GRANT ALL ON *.* TO buser@'172.18.67.%' IDENTIFIED BY 'bpass'; MariaDB [hellodb]> FLUSH PRIVILEGES; [root@node2 ~]# mkdir /mydata/backup -pv [root@node2 ~]# innobackupex --user=buser --host=172.18.67.12 --password=bpass --databases=hellodb /mydata/backup/ 备份hellodb库 [root@node2 ~]# innobackupex --user=buser --host=172.18.67.12 --password=bpass /mydata/backup/ 备份全部
恢复:
[root@node1 ~]# rm /var/lib/mysql/* -rf [root@node2 backup]# scp -rp 2017-06-04_14-09-37 root@172.18.67.11:/tmp/ [root@node1 ~]# systemctl stop mariadb [root@node1 ~]# innobackupex --user=root --host=localhost --copy-back /tmp/2017-06-04_14-09-37/ [root@node1 ~]# chown -R mysql.mysql /var/lib/mysql/ [root@node1 ~]# systemctl start mariadb