通常数据库备份database数据文件binlog日志文件my.cnf配置文件,所有的数据库的备份数据都应放在非数据库本地, 而且建议备份多份。
仅备份是没有任何意义, 需要在测试环境中做日常恢复演练, 测试备份的可用性, 恢复较比备份更加的重要。
备份: 能够有效防止设备故障以及人为误操作带来的数据丢失, 例如:将数据文件保存在远端。
冗余: 数据有多分冗余, 但不等于备份, 只能防止机械故障丢失的数据, 例如: 主备模式、数据库集群。
数据库备份必须考虑因素
1.数据的一致性
2.服务的可用性
数据库备份方式
1.逻辑备份: 备份DDL DML DCL语句, 适用于中小型数据库, 效率相对低下。 mysqldump、mydumper
2.物理备份: 直接复制数据库文件, 适用于大型数据库环境, 效率相对较高。xtrabackup、inbackup、cp、tar、lvm snapshot
数据库备份模式
完全备份
增量备份
差异备份
1.MySQL逻辑备份与恢复
mysql自带逻辑备份工具mysqldump, 可以保证数据备份一致性, 以及服务可用性
1.1数据库完整备份与恢复
mysqldump命令使用方式
>mysqldump -h 服务器 -u 用户名 -p 密码 数据库名 > 备份文件.sql
//常用参数
-A, --all-databases #备份所有库
-B, --databases #备份多个库多个数据库
--single-transaction#InnoDB 一致性 服务可用性
--master-data=1|2 #记录 binlog日志位置与文件名,追加至备份文件中
--triggers #备份触发器
-F, --flush-logs #备份之前刷新日志
-E, --events #备份事件调度器代码
-R, --routines #备份存储过程和存储函数
注意: 不管物理备份还是逻辑备份, 必须开启binlog日志
1.使用mysqldump完整备份
//本地备份
[root@sql ~]# mkdir /backup/mysql -p
mysqldump -uroot -p'123' \
--all-databases \
--single-transaction \
--master-data=1 \
--flush-logs > /backup/mysql/`date +%F%H`-mysql-all.sql
2.查看binlog日志信息
[root@sql ~]# sed -n "22p" /backup/mysql/2018-05-1203-mysql-all.sql
CHANGE MASTER TO MASTER_LOG_FILE='bgx.000003', MASTER_LOG_POS=154;
数据库完整恢复流程
1.停止数据库
2.删除破损数据库
3.重新初始化数据库
4.重置密码,否则无法恢复
5.恢复数据[新密码]
6.刷新授权[备份时密码]
1.模拟数据奔溃
[root@sql ~]# systemctl stop mysqld
[root@sql ~]# rm -rf /var/lib/mysql/*
2.重新初始化数据库,启动后修改密码
[root@sql ~]# systemctl start mysqld
[root@sql ~]# grep "password" /var/log/mysqld.log
khy_=i512g=F
[root@sql ~]# mysqladmin -uroot -p'khy_=i512g=F' password "Bgx123.com"
4.导入备份数据
[root@sql ~]# mysql -uroot -p'Bgx123.com' < /backup/mysql/2018-05-1203-mysql-all.sql
//使用恢复后的密码进行登录mysql
[root@sql ~]# mysql -uroot -p123
mysql>
5.建议在恢复备份时暂停binlog日志记录
//1.关闭binlog记录, 不然容易恢复增量失败
[root@sql mysql]# sed -i '23aSET sql_log_bin=0;' /backup/mysql/2018-05-1205-mysql-all.sql
//2.在mysql控制台临时修改不记录binlog日志
mysql> set sql_log_bin=0;
mysql> source /backup/mysql/2018-05-1203-mysql-all.sql
1.2数据库增量备份与恢复
实战案例1: 数据库完整备份+数据库增量备份
新建数据表, 进行了全量备份, 随着时间推移, 数据库突然奔溃
1.环境准备
//备份之前
mysql> create database bgx;
mysql> create table bgx.t1 (id int, name varchar(20));
mysql> insert into bgx.t1 values (1,"bgx1");
mysql> insert into bgx.t1 values (2,"bgx2");
mysql> select * from bgx.t1;
+------+------+
| id | name |
+------+------+
| 1 | bgx1 |
| 2 | bgx2 |
+------+------+
2 rows in set (0.00 sec)
//基于当前状态备份
[root@sql ~]# mysqldump -uroot -p'123' \
--all-databases \
--single-transaction \
--master-data=1 \
--flush-logs > /backup/mysql/`date +%F%H`-mysql-all.sql
//模拟数据插入操作
mysql> insert into bgx.t1 values (3,"bgx3");
mysql> insert into bgx.t1 values (5,"tt");
mysql> select * from bgx.t1;
+------+------+
| id | name |
+------+------+
| 1 | bgx1 |
| 2 | bgx2 |
| 3 | bgx3 |
| 5 | tt |
+------+------+
4 rows in set (0.00 sec)
//模拟数据库故障
[root@sql ~]# systemctl stop mysqld
[root@sql ~]# rm -rf /var/lib/mysql/*
//重新启动会自动初始化操作
[root@sql ~]# systemctl start mysqld
//注意修改默认密码
[root@sql ~]# mysqladmin -uroot -p'RA+:>Xu&.6K_' password "Bgx123.com"
2.恢复全备数据
//关闭binlog记录, 不然容易恢复增量失败
[root@sql mysql]# sed -i '23aSET sql_log_bin=0;' /backup/mysql/2018-05-1205-mysql-all.sql
[root@sql ~]# mysql -uroot -p'Bgx123.com' < /backup/mysql/2018-05-1205-mysql-all.sql
[root@sql mysql]# mysql -uroot -p'Bgx123.com' -e "select * from bgx.t1;"
+------+------+
| id | name |
+------+------+
| 1 | bgx1 |
| 2 | bgx2 |
+------+------+
3.恢复增量数据
//查看备份后binlog起始位置点
[root@sql ~]# sed -n '22p' /backup/mysql/2018-05-1205-mysql-all.sql
CHANGE MASTER TO MASTER_LOG_FILE='bgx.000061', MASTER_LOG_POS=154;
//查找结束位置点, 进行恢复
[root@sql bin]# mysqlbinlog --start-position=1490 --stop-position=1652 \
bgx.000001|mysql -uroot -p'Bgx123.com'
实战案例2: 数据库完整备份+数据库增量备份
例子:现在有一个运维人员误删除了数据库,或者是某一张表
1.删除所有数据库
2.删除所有binlog日志
3.重启mysqld服务
1.模拟环境准备
mysql> create database bgxdb;
mysql> use bgxdb;
mysql> create table t1 (id int,name varchar(20));
mysql> insert into t1 values (1,"ccr");
mysql> insert into t1 values (2,"tfr");
mysql> select * from t1;
+------+------+
| id | name |
+------+------+
| 1 | ccr |
| 2 | tfr |
2.使用mysqldump进行全备
[root@sql ~]# mysqldump -uroot -p'Bgx123.com' \
--all-databases \
--single-transaction \
--master-data=1 \
--flush-logs > /backup/mysql/`date +%F%H`-mysql-all.sql
3.再次插入一些数据
mysql> insert into t1 values
(3,'trl'),
(4,'zx'),
(5,'wq'),
(6,'tj'),
(7,'gwt');
mysql> select * from t1;
+------+------+
| id | name |
+------+------+
| 1 | ccr |
| 2 | tfr |
| 3 | trl |
| 4 | zx |
| 5 | wq |
| 6 | tj |
| 7 | gwt |
+------+------+
7 rows in set (0.00 sec)
3.模拟故障
mysql> delete from t1 where id ='2';
mysql> drop database bgxdb;
4.恢复全量备份的数据
[root@sql ~]# sed -i '23aSET sql_log_bin=0;' /backup/mysql/2018-05-1215-mysql-all.sql
[root@sql ~]# mysql -uroot -p'Bgx123.com' < /backup/mysql/2018-05-1215-mysql-all.sql
[root@sql ~]# mysql -uroot -p'Bgx123.com' -e "select * from bgxdb.t1;"
+------+------+
| id | name |
+------+------+
| 1 | ccr |
| 2 | tfr |
+------+------+
5.通过mysqlbinlog命令导出关于数据库bgxdb的sql语句
//针对全量备份后仅产生1个binlog文件的方式
[root@sql bin]# mysqlbinlog --start-position=154 --base64-output="decode-rows" -v bgx.000002 > db.sql
全量备份到出问题只产生了一个 mysql-bin.000021 文件,
如果产生了多个binlog日志, 可是使用下面方法恢复
mysqlbinlog --base64-output="decode-rows" -v mysql-bin.000021 >> 1.sql
6.查看sql文件,找到误操作语句对应的位置,然后记录下来, 随后恢复时跳过即可
7.使用mysqlbinlog进行恢复跳过drop与delete语句
[root@sql bin]# mysqlbinlog --start-position=154 --stop-position=1648 bgx.000002 |mysql -uroot -p'Bgx123.com'
[root@sql bin]# mysqlbinlog --start-position=1692 --stop-position=1723 bgx.000002 |mysql -uroot -p'Bgx123.com'
[root@sql bin]# mysql -uroot -p'Bgx123.com' -e "select * from bgxdb.t1;"
+------+------+
| id | name |
+------+------+
| 1 | ccr |
| 2 | tfr |
| 3 | trl |
| 4 | zx |
| 5 | wq |
| 6 | tj |
| 7 | gwt |
+------+------+
2.MySQL物理备份与恢复
percona-xtrabackup物理备份+binlog
开源免费并支持MySQL数据库热备份的软件,它能对 InnoDB和XtraDB存储引擎的数据库非阻塞地备份。无需暂停服务备份MySQL
支持MySQL增量备份
支持MySQL差异备份
备份MySQL不增加服务器负载
创建replication更加便捷
安装xtrabackup官方下载地址
[root@sql ~]# yum install -y \
https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.11/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.11-1.el7.x86_64.rpm
2.1数据库完整备份与恢复
1.完整备份流程
//1.创建备份目录
[root@sql ~]# mkdir /xtrabackup/
//2.执行全备操作
[root@sql ~]# innobackupex --user=root --password="Bgx123.com" /xtrabackup/
//3.检查备份结果
[root@sql ~]# ls /xtrabackup/
2018-05-08_04-34-06
[root@sql ~]# cat /xtrabackup/2018-05-08_04-34-06/xtrabackup_binlog_info
bgx.000002 4447
2.完全备份恢复流程
#1.停止数据库
[root@sql ~]# systemctl stop mysqld
#2.清理环境
[root@sql ~]# rm -rf /var/lib/mysql/*
#3.重演回滚
[root@sql ~]# innobackupex --apply-log /xtrabackup/2018-05-08_04-34-06/
#4.恢复数据
[root@sql ~]# innobackupex --copy-back /xtrabackup/2018-05-08_04-34-06/
#5.修改权限
[root@sql ~]# chown -R mysql.mysql /var/lib/mysql
#6.启动数据库
[root@sql ~]# systemctl start mysqld
[root@sql ~]# mysql -uroot -pBgx123.com
mysql>
2.2数据库增量备份与恢复
增量备份每次需要基于前一次的备份
1.准备数据
#周三的数据
mysql> create database bgxdb;
mysql> use bgxdb;
mysql> create table t1(id int, name varchar(20));
mysql> insert into t1 values (3,'day3');
mysql> select * from t1;
+------+------+
| id | name |
+------+------+
| 3 | day3 |
+------+------+
2.使用物理全备
[root@sql ~]# innobackupex --username=root --password=Bgx123.com /xtrabackup/
3.后续每天进行增量备份
//周四,登陆mysql插入数据
[root@sql ~]# date -s '2018-05-09'
mysql> insert into bgxdb.t1 values (4,'day4');
mysql> select * from t1;
+------+------+
| id | name |
+------+------+
| 3 | day3 |
| 4 | day4 |
+------+------+
[root@sql ~]# innobackupex --user=root --password='Bgx123.com' \
--incremental /xtrabackup/ \
--incremental-basedir=/xtrabackup/2018-05-08_04-51-04/
[root@sql ~]# cat /xtrabackup/2018-05-09_00-00-28/xtrabackup_binlog_info
bgx.000003 1039
//周五,登陆mysql插入数据
[root@sql ~]# date -s '2018-05-10'
mysql> insert into bgxdb.t1 values (5,'day5');
mysql> select * from bgxdb.t1;
+------+------+
| id | name |
+------+------+
| 3 | day3 |
| 4 | day4 |
| 5 | day5 |
+------+------+
//基于周四基础之上进行增备
[root@sql ~]# innobackupex --user=root --password='Bgx123.com' \
--incremental /xtrabackup/ \
--incremental-basedir=/xtrabackup/2018-05-09_00-00-28/
[root@sql ~]# cat /xtrabackup/2018-05-10_00-01-50/xtrabackup_binlog_info
bgx.000003 1297
4.模拟故障
//1.停止数据库
[root@sql ~]# systemctl stop mysqld
//2.清理环境
[root@sql ~]# rm -rf /var/lib/mysql/*
5.依次重演
//恢复周三全备数据
[root@sql ~]# innobackupex --apply-log \
--redo-only /xtrabackup/2018-05-08_04-51-04/
//恢复周四的增量数据
[root@sql ~]# innobackupex --apply-log \
--redo-only /xtrabackup/2018-05-08_04-51-04/ \
--incremental-dir=/xtrabackup/2018-05-09_00-00-28
//恢复周五的增量数据
[root@sql ~]# innobackupex --apply-log \
--redo-only /xtrabackup/2018-05-08_04-51-04/ \
--incremental-dir=/xtrabackup/2018-05-10_00-23-24
6.执行回滚
//恢复对应数据
[root@sql ~]# innobackupex --copy-back /xtrabackup/'2018-05-08_04-51-04'/
//授权
[root@sql ~]# chown -R mysql.mysql /var/lib/mysql
//启动数据库
[root@sql ~]# systemctl start mysqld
//查询数据
[root@sql ~]# mysql -uroot -pBgx123.com -e "select * from bgxdb.t1;"
+------+------+
| id | name |
+------+------+
| 3 | day3 |
| 4 | day4 |
| 5 | day5 |
+------+------+
2.3数据库差异备份与恢复
1.完整备份
//修改时间为周三
[root@sql ~]# date -s '2018-05-08'
//创建对应数据
mysql> create database bgxdb;
mysql> use bgxdb;
mysql> create table t2(id int);
mysql> insert into t2 values(3);
mysql> select * from t2;
+------+
| id |
+------+
| 3 |
+------+
//使用物理全备
[root@sql ~]# mkdir /xtrabackup
[root@sql ~]# innobackupex --user=root --password='Bgx123.com' /xtrabackup/
[root@sql ~]# cat /xtrabackup/2018-05-08_09-21-06/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 5357964
last_lsn = 5362222
compact = 0
recover_binlog_info = 0
2、差异备份:周四 -> 周六
//修改时间为周四, 新增数据
[root@sql ~]# date -s '2018-05-09'
mysql> insert into bgxdb.t2 values(4);
//差异备份(以完整备份为准2018-05-08_09-21-06)
[root@sql ~]# innobackupex --user=root --password='Bgx123.com' \
--incremental /xtrabackup/ \
--incremental-basedir=/xtrabackup/2018-05-08_09-21-06/
//修改时间为周五, 新增数据
[root@sql ~]# date -s '2018-05-10'
mysql> insert into bgxdb.t2 values(5);
//差异备份(以完整备份为准2018-05-08_09-21-06)
[root@sql ~]# innobackupex --user=root --password=Bgx123.com \
--incremental /xtrabackup/ \
--incremental-basedir=/xtrabackup/2018-05-08_09-21-06/
//修改时间为周六, 新增数据
[root@sql ~]# date -s '2018-05-11'
mysql> insert into bgxdb.t2 values(6);
//差异备份, (以完整备份为准2018-05-08_06-48-44)
[root@sql ~]# innobackupex --user=root --password=Bgx123.com \
--incremental /xtrabackup/ \
--incremental-basedir=/xtrabackup/2018-05-08_09-21-06/
3.模拟备份后一次错误操作
mysql> create database Linux;
mysql> drop database Linux;
4.差异备份恢复流程
//1.停止数据库
[root@sql ~]# systemctl stop mysqld
//2.清理环境
[root@sql ~]# rm -rf /var/lib/mysql/*
//3.重演回滚, 回滚全备
[root@sql ~]# innobackupex --apply-log --redo-only /xtrabackup/2018-05-08_09-21-06/
//4.重演回滚, 将差异备份应用至完整备份上
[root@sql ~]# innobackupex --apply-log --redo-only /xtrabackup/2018-05-08_09-21-06/ \
--incremental-dir=/xtrabackup/2018-05-11_00-01-27/
//5.应用数据
[root@sql ~]# innobackupex --copy-back /xtrabackup/2018-05-08_09-21-06/
//6.修改权限
[root@sql ~]# chown -R mysql.mysql /var/lib/mysql
//7.启动数据库
[root@sql ~]# systemctl start mysqld
[root@sql ~]# mysql -uroot -pBgx123.com -e "select * from bgxdb.t2;"
+------+
| id |
+------+
| 3 |
| 4 |
| 5 |
| 6 |
+------+
5.binlog恢复删除掉的linux库
[root@sql ~]# cat /xtrabackup/2018-05-11_00-01-27/xtrabackup_binlog_info
bgx.000001 1490
//导出对应的sql, 找到drop语句位置
[root@sql ~]# mysqlbinlog --start-position=1490 \
--base64-output="decode-rows" \
-v bgx.000001 bgx.000002 >db.sql
//针对起始点与结束点位置恢复
[root@sql bin]# mysqlbinlog --start-position=1490 \
--stop-position=1652 bgx.000001|mysql -uroot -p'Bgx123.com'
3.简单命令进行物理备份
使用tar命令打包来进行物理备份数据库系统
备份期间,服务不可用
1.备份操作过程
//1.停止数据库
[root@sql ~]# systemctl stop mysqld
//2.
[root@sql ~]# mkdir /backup
//3.tar备份数据
[root@sql ~]# tar -cf /backup/`date +%F`-mysql-all.tar /var/lib/mysql
注:备份文件应该复制其它服务器或存储上
2.恢复操作过程
//1.停止数据库
[root@sql ~]# systemctl stop mysqld
//2.清理环境
[root@sql ~]# rm -rf /var/lib/mysql/*
//3.导入备份数据
[root@sql ~]# tar -xf /backup/2018-05-08-mysql-all.tar -C /
//4.启动数据库
[root@sql ~]# systemctl start mysqld
//5.binlog 恢复
4.生产备份思路与实战
逻辑备份
保证一致性,服务可用性
适合少量的数据1G-10G
只能全备->指定某一个数据库备份
效率不是很高, 将所有的数据转成sql语句
ddl dml dcl
物理备份xtrabackup
保证一致性,服务可用性
适合大量的数据10G 100G 500G
支持增量、差异、全备
备份怎么做
物理备份 周天全备 周一到周六增量
/xtrabackup/1月/1周/xxx
/xtrabackup/1月/2周/xx
/xtrabackup/1月/3周
/xtrabackup/1月/4周
/xtrabackup/2月/1周
注意:
binlog日志非常的重要
备份时,不要记录binlog日志
备份不单单只是数据文件,还有binlog、my.cnf