mysql备份恢复
mysqldump备份
企业故障恢复案例:
正在运行的网站系统 mysql数据库 数据量25G,日业务量10-15M
备份策略:
每天晚上23点通过计划任务调用mysqldump执行全备脚本
故障时间点:
周四上午 开发误删除了一个表,如何恢复?
思路:
1. 停业务避免数据二次伤害
2. 找一个临时库,恢复周三23.00 全备
3. 截取 周三 23.00 ---> 周四10点 误删除之间的binlog,恢复到临时数据库
4. 测试可用性和完整性
5.
5.1 方法1: 直接用临时卡顶替原有生产库,前端应用割接到新库
5.2 方法2: 将误删除的表导出,导入到原生产库
6. 开启业务
故障演练:
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000007 | 2070 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql> flush logs;
Query OK, 0 rows affected (0.01 sec)
#创建一个新库
mysql> create table backup.full select * from world.city;
Query OK, 4079 rows affected (0.04 sec)
Records: 4079 Duplicates: 0 Warnings: 0 #这个直接取了 实验文件 wolrd 的数据到新库。
现在有数据了。
mysql> create table backup.full_1 select * from mysql.user;
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0
验证数据是否有了:
mysql> use backup
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+------------------+
| Tables_in_backup |
+------------------+
| full |
| full_1 |
+------------------+
2 rows in set (0.00 sec) #可以看到有两个数据表了。 现在做一次全备。
## 周三全备:
[root@localhost ~]# mkdir /backup -p
[root@localhost ~]# cd /backup
[root@localhost ~]# mysqldump -uroot -p123 -A -R --triggers --master-data=2 --single-transaction|gzip >/backup/full_$(date +%F).sql.gz
[root@localhost ~]# ll -h /backup/
total 328K
-rw-r--r-- 1 root root 328K Oct 12 21:25 full_2020-10-12.sql.gz
## 模拟23:00到周四数据丢失的变化【属于正常修改】
现在在创建一点数据
mysql> create table backup.thur select * from world.country;
Query OK, 239 rows affected (0.01 sec)
Records: 239 Duplicates: 0 Warnings: 0
通过查询可以看到:
select * from backup.full;
4079 rows in set (0.01 sec) 有439行数据。
模拟删除修改数据:
mysql> use backup;
mysql> update full set countrycode='CHN'; #模拟不小心把所有地区都改为了CHN
mysql> commit;
Query OK, 0 rows affected (0.00 sec) #并执行了提交
mysql> delete from full where id>200; #大部分数据都删除了 只保留了200行
Query OK, 3879 rows affected (0.02 sec)
mysql> commit; #并执行了提交
Query OK, 0 rows affected (0.00 sec)
### 模拟故障,删除了一个表 【属于异常修改】
mysql> show tables;
+------------------+
| Tables_in_backup |
+------------------+
| full |
| full_1 |
| thur |
+------------------+
3 rows in set (0.00 sec)
mysql> drop table thur; #<------------ 删除表
Query OK, 0 rows affected (0.00 sec)
mysql> show tables; #现有表
+------------------+
| Tables_in_backup |
+------------------+
| full |
| full_1 |
+------------------+
2 rows in set (0.00 sec)
-----------------------------------------------
-----------------------------------------------
恢复过程:
1. 关闭原有数据库
2. 启动一个新数据库
3. 解压备份数据
[root@localhost backup]# gzip -d full_2020-10-12.sql.gz
[root@localhost backup]# ll
total 1104
-rw-r--r-- 1 root root 1126759 Oct 12 21:25 full_2020-10-12.sql
4. 截取二进制日志:
去备份的sql中找
[root@localhost backup]# vim full_2020-10-12.sql
在这里明显可以看到备份的那个binlog日志和起始位置:
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000008', MASTER_LOG_POS=120; #备份文件中的起始位置
mysqlbinlog --start-position=120 --stop-position=[待查找] /data/mysql/mysql-bin.000008
5. 获取binlog日志最后一次正常操作的binlog。
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000008 | 399383 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
找出删除时间点的 position号:
| mysql-bin.000008 | 399262 | Query | 1 | 399383 | use `backup`; DROP TABLE ...
找到开始位置 399262 [这是删除这个表之前的位置。]
将命令的结尾改成下面这样,然后执行:
[root@localhost backup]# mysqlbinlog --start-position=120 --stop-position=399262 /data/mysql/mysql-bin.000008 >/backup/inc.sql
6. 截取数据完毕后,开始恢复数据:
先去一台临时mysql服务器恢复数据,检查
root@localhost backup]# scp -r /backup/inc.sql [email protected]:/root
另一台数据库操作如下:
set sql_log_bin=0;
source /root/full_2020-10-12.sql
source /root/inc.sql
检查数据:
MariaDB [world]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| backup |
| binlog |
| mysql |
| performance_schema |
| test |
| world |
+--------------------+
7 rows in set (0.00 sec)
MariaDB [backup]> show tables; #船舰的表都在
+------------------+
| Tables_in_backup |
+------------------+
| full |
| full_1 |
| thur |
+------------------+
3 rows in set (0.00 sec)
恢复完毕。