一 理解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* [email protected]:/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做增量备份;
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 [email protected]:/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