备份的分类
完全备份
顾名思义,备份整个数据库所有内容。
增量备份
仅备份当前到最近一次完全备份或增量备份之间的数据。备份较快,但还原相对复杂,需要最近一次的完全备份和所有之后的增量备份,并且按备份顺序依次进行还原。
差异备份
仅备份当前到最近一次完全备份之间的数据。备份相对较慢,还原简单,只需要最近一次的完全备份和最后一次的差异备份数据即可完成还原操作。
冷备
数据库停止服务,备份期间读写均不支持。
温备
对数据库进行加读锁,备份期间可读不可写。
热备
备份期间读写均可。
物理备份
直接拷贝数据库文件进行备份
逻辑备份
从数据库中导出数据进行备份,
备份策略的制定
需要备份哪些数据
多久备份一次
什么时间进行备份
备份所需时长
选择什么备份手段
恢复数据演练,了解恢复数据所需要的数据
常用的备份方式
cp,tar,rsync等复制归档工具:适用于所有引擎,只支持冷备,推荐使用rsync -a,可以保留权限和属性
lvm快照:先加读锁,做快照后解锁,几乎算得上热备,复制完数据后记得删除快照
mysqldump:适用于所有引擎,MyISAM支持温备,InnoDB支持热备。
xtrabackup:Percona提供的InnoDB热备工具,功能强大
使用rsync进行备份数据还原
# 备份数据到远程服务器
[root@centos81 ~]#rsync -a /var/lib/mysql 10.0.0.84:/data/backup/
[root@centos81 ~]#rsync -a /data/binlog 10.0.0.84:/data/backup/
[root@centos81 ~]#rsync -a /etc/my.cnf 10.0.0.84:/data/backup/
# 假设原mysql机器服务器崩溃或者磁盘损坏,现在要在新机器上重新安装mysql服务,模拟还原数据过程,注意尽量和原本的机器上的mysql版本,安装方式一致。
[root@centos82 ~]#yum -y install mysql-server
# 将远程机器上的备份数据拷贝到当前新机器上
[root@centos82 ~]#rsync -a 10.0.0.84:/data/backup/ .
# 还原数据
[root@centos82 ~]#mv /data/backup/mysql /var/lib/
[root@centos82 ~]#mv /data/backup/binlog /data/
[root@centos82 ~]#mv /data/backup/my.cnf /etc/
# 启动数据库查看还原情况
[root@centos82 ~]#systemctl enable --now mysqld
# 如果原mysql服务机器存放binlog的磁盘没有损坏,还可以将binlog复制过来进一步还原。
[root@centos81 ~]#scp /data/binlog/mysql-bin.000003 10.0.0.82:/root/
[root@centos82 ~]#mysqlbinlog mysql-bin.000003 > binlog003.sql
# 进入数据库先关闭二进制日志功能,导入binlog数据后重新再开启。
[root@centos82 ~]#mysql -uroot -p'123456'
mysql> set sql_log_bin=off;
mysql> source /root/binlog003.sql
mysql> set sql_log_bin=on;
mysqldump的使用
使用mysqldump实现分库备份并压缩
# 方法1:使用for循环
[root@centos82 ~]#for db in `mysql -e 'show databases' | egrep -v '(Database|information_schema|performance_schema|sys)'`;do mysqldump -B $db | gzip > /data/$db.sql.gz; done
# 方法2:使用sed
[root@centos82 ~]#mysql -e 'show databases' | sed -rn '/(Database|information_schema|performance_schema|sys)/!s#.*#mysqldump -B & | gzip > /data/&.sql.gz#p' | bash
# 方法3:使用awk
[root@centos82 ~]#mysql -e 'show databases' | awk '!/(Database|information_schema|performance_schema|sys)/{print "mysqldump -B",$0,"| gzip > /data/"$0".sql.gz"}' | bash
mysqldump完全备份还原
[root@centos82 ~]#mysqldump -uroot -p123456 -A -F --single-transaction --master-data=1 | gzip > /data/backup/all-data-`data +%F`.sql.gz
[root@centos82 ~]#gzip -d all-data-2020-10-15.sql.gz
[root@centos82 ~]#mysql
mysql> set sql_log_bin=off;
mysql> source /root/all-data-2020-10-15.sql
mysql> set sql_log_bin=on;
查看二进制日志备份点,备份后续二进制日志实现增量备份及还原
-- 查看二进制日志备份点
[root@centos82 ~]#grep '^-- CHANGE MASTER TO' /data/backup/all-data-2020-10-15.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=1285;
[root@centos82 ~]#mysqlbinlog /data/binlog/mysql-bin.000002 --start-position=1285 > inc.sql
[root@centos82 ~]#mysqlbinlog /data/binlog/mysql-bin.000003 >> inc.sql
-- 备份
[root@centos82 ~]#scp inc.sql 10.0.0.84:/data/backup/
-- 还原
[root@centos82 ~]#mysql
mysql> set sql_log_bin=off;
mysql> source /root/inc.sql
mysql> set sql_log_bin=on;
xtrabackup的使用
安装xtrabackup
xtrabackup有2.4和8两个版本,分别适用于mysql5.7和mysql8.0版本的备份。
在官网下载对应的rpm或者deb包,使用yum或apt进行安装
xtrabackup完全备份及还原
# 数据库完全备份
[root@centos7 ~]#xtrabackup -uroot -p744123 --backup --target-dir=/backup/
[root@centos7 ~]#ll /backup/
total 12336
-rw-r----- 1 root root 487 Oct 20 09:06 backup-my.cnf
drwxr-x--- 2 root root 310 Oct 20 09:06 hellodb
-rw-r----- 1 root root 425 Oct 20 09:06 ib_buffer_pool
-rw-r----- 1 root root 12582912 Oct 20 09:06 ibdata1
drwxr-x--- 2 root root 4096 Oct 20 09:06 mysql
drwxr-x--- 2 root root 8192 Oct 20 09:06 performance_schema
drwxr-x--- 2 root root 8192 Oct 20 09:06 sys
-rw-r----- 1 root root 138 Oct 20 09:06 xtrabackup_checkpoints
-rw-r----- 1 root root 429 Oct 20 09:06 xtrabackup_info
-rw-r----- 1 root root 2560 Oct 20 09:06 xtrabackup_logfile
# 备份到远程服务器
[root@centos7 ~]# scp -r /backup 10.0.0.84:/data/
# 还原数据库
# 将远程服务器的数据拷贝回来
[root@centos7 ~]# scp -r 10.0.0.84:/data/backup .
# 数据恢复前预准备,回滚数据中未完成的事务
[root@centos7 mysql]#xtrabackup --prepare --target-dir=/backup
# 复制回数据库,注意数据库目录不能有任何其他文件
[root@centos7 mysql]#xtrabackup --copy-back --target-dir=/backup
# 修改用户组
[root@centos7 mysql]#chown -R mysql.mysql /data/mysql/
# 启动mysql服务,还原完成
[root@centos7 mysql]#service mysqld start
Starting MySQL.Logging to '/data/mysql/mysql.log'.
SUCCESS!
xtrabackup实现增量备份及还原
# 数据库完全备份
[root@centos7 ~]#xtrabackup -uroot -p744123 --backup --target-dir=/backup/base/
# 插入两条数据,模拟数据库第一次发生变化
[root@centos7 mysql]#mysql -uroot -p744123 -e "insert into hellodb.teachers (name,age,gender) values ('zhangsan',33,'F'),('lisi',52,'M')"
# 查看确认插入数据成功
root@localhost [hellodb]>select * from teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 93 | F |
| 5 | wang | 22 | M |
| 6 | mage | 62 | F |
| 7 | zhangsan | 33 | F |
| 8 | lisi | 52 | M |
+-----+---------------+-----+--------+
8 rows in set (0.00 sec)
# 第一次增量备份
[root@centos7 mysql]#xtrabackup -uroot -p744123 --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/base
[root@centos7 mysql]#tree -d -L 1 /backup/
/backup/
├── base
└── inc1
[root@centos7 mysql]#du -sh /backup/*
39M/backup/base
3.2M/backup/inc1
# 再次插入两条数据,模拟数据库第二次发生变化
[root@centos7 mysql]#mysql -uroot -p744123 -e "insert into hellodb.teachers (name,age,gender) values ('xiaoming',35,'M'),('xiaohong',27,'F')"
# 查看确认插入数据成功
root@localhost [hellodb]>select * from teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 93 | F |
| 5 | wang | 22 | M |
| 6 | mage | 62 | F |
| 7 | zhangsan | 33 | F |
| 8 | lisi | 52 | M |
| 9 | xiaoming | 35 | M |
| 10 | xiaohong | 27 | F |
+-----+---------------+-----+--------+
10 rows in set (0.00 sec)
# 第二次增量备份
[root@centos7 mysql]#xtrabackup -uroot -p744123 --backup --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1
[root@centos7 backup]#tree -d -L 1 /backup/
/backup/
├── base
├── inc1
└── inc2
[root@centos7 backup]#du -sh /backup/*
39M/backup/base
3.2M/backup/inc1
3.2M/backup/inc2
# 备份到远程服务器
[root@centos7 ~]# scp -r /backup/* 10.0.0.84:/data/
# 还原数据库
# 将远程服务器的数据拷贝回来
[root@centos7 ~]# scp -r 10.0.0.84:/data/backup/ .
# 数据恢复前预准备,最后一次合并备份前需要加--apply-log-only,阻止事务回滚
[root@centos7 backup]#xtrabackup --prepare --apply-log-only --target-dir=/backup/base
# 合并第一次增量备份
[root@centos7 backup]#xtrabackup --prepare --apply-log-only --target-dir=/backup/base --incremental-dir=/backup/inc1
# 合并第二次增量备份,由于这里是最后一次合并备份,所以不需要加--apply-log-only,使最后一次备份数据中未完成的事务进行回滚,让数据统一。另外,如果有binlog日志的话,可以继续使用binlog日志将数据库还原到最新状态。
[root@centos7 backup]#xtrabackup --prepare --target-dir=/backup/base --incremental-dir=/backup/inc2
[root@centos7 backup]#du -sh /backup/*
155M/backup/base
12M/backup/inc1
12M/backup/inc2
# 将准备好的数据复制回数据库,复制前确保数据库目录为空
[root@centos7 backup]#ll /data/mysql/
total 0
[root@centos7 mysql]#xtrabackup --copy-back --target-dir=/backup/base
# 修改用户组
[root@centos7 mysql]#chown -R mysql.mysql /data/mysql/
# 启动mysql服务
[root@centos7 mysql]#service mysqld start
Starting MySQL.Logging to '/data/mysql/mysql.log'.
SUCCESS!
# 确认数据无误,还原完成
root@localhost [hellodb]>select * from teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 93 | F |
| 5 | wang | 22 | M |
| 6 | mage | 62 | F |
| 7 | zhangsan | 33 | F |
| 8 | lisi | 52 | M |
| 9 | xiaoming | 35 | M |
| 10 | xiaohong | 27 | F |
+-----+---------------+-----+--------+
10 rows in set (0.00 sec)