内容待补充
案例文字说明:
7.3 故障时间点:
周四上午10点,开发人员误删除了一个表,如何恢复?
7.4 思路:
1、停业务,避免数据的二次伤害
2、找一个临时库,恢复周三23:00全备
3、截取周三23:00 --- 周四10点误删除之间的binlog,恢复到临时库
4、测试可用性和完整性
5、
5.1 方法一:直接使用临时库顶替原生产库,前端应用割接到新库
5.2 方法二:将误删除的表导出,导入到原生产库
6、开启业务
实验过程code
1 #------------------------------------------------------------------------------- 2 # 3 # 企业案例恢复操作 4 # 1.1 全备+恢复部分误删除的表(全备期间删除或者全备完成后删除) 5 # Author:nod 6 # Date:18-08-05 7 #------------------------------------------------------------------------------- 8 9 10 11 12 #------------------------------------------------------------------------------- 13 # 启动实例模拟备用数据库 14 #------------------------------------------------------------------------------- 15 mysqld_safe --defaults-file=/data/3307/my.cnf & 16 17 [root@db01 tmp]# netstat -lnp | grep 330* 18 tcp 0 0 :::3306 :::* LISTEN 45894/mysqld 19 tcp 0 0 :::3307 :::* LISTEN 46940/mysqld 20 unix 2 [ ACC ] STREAM LISTENING 146100 46940/mysqld /data/3307/mysql.sock 21 22 23 #------------------------------------------------------------------------------- 24 # 主库模拟数据 25 #------------------------------------------------------------------------------- 26 [root@db01 tmp]# mysql -uroot -p123 -A 27 28 mysql> flush logs; 29 30 mysql> show master status; 31 +------------------+----------+--------------+------------------+-------------------+ 32 | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | 33 +------------------+----------+--------------+------------------+-------------------+ 34 | mysql-bin.000012 | 120 | | | | 35 +------------------+----------+--------------+------------------+-------------------+ 36 1 row in set (0.00 sec) 37 38 39 mysql> create database backup; 40 41 mysql> create table backup.full select * from world.city; 42 43 mysql> create table backup.full_1 select * from mysql.user; 44 45 #------------------------------------------------------------------------------- 46 # 模拟主库每天定时进行全备 47 #------------------------------------------------------------------------------- 48 [root@db01 backup]# mysqldump -uroot -p123 -A -R --triggers --master-data=2 --single-transaction|gzip > /backup/full_$(date +%F).sql.gz 49 Warning: Using a password on the command line interface can be insecure. 50 51 [root@db01 backup]# ll 52 total 328 53 -rw-r--r-- 1 root root 334770 Aug 5 22:19 full_2018-08-05.sql.gz 54 55 56 57 #------------------------------------------------------------------------------- 58 # 模拟主库数据发生变化 59 # 故障前thur数据为239rows 60 #------------------------------------------------------------------------------- 61 mysql> create table backup.thur select * from world.country; 62 Query OK, 239 rows affected (0.11 sec) 63 Records: 239 Duplicates: 0 Warnings: 0 64 65 mysql> update backup.full set countrycode='CHN'; 66 Query OK, 3716 rows affected (0.04 sec) 67 Rows matched: 4079 Changed: 3716 Warnings: 0 68 69 mysql> delete from backup.full where id>200; 70 Query OK, 3879 rows affected (0.05 sec) 71 72 #------------------------------------------------------------------------------- 73 # 模拟主库数据故障 删除thur表 74 #------------------------------------------------------------------------------- 75 mysql> drop table thur; 76 77 78 #------------------------------------------------------------------------------- 79 # 开始恢复数据部分 80 #------------------------------------------------------------------------------- 81 82 83 #------------------------------------------------------------------------------- 84 # 通过全备进行数据分析 85 #------------------------------------------------------------------------------- 86 [root@db01 backup]# gzip -d full_2018-08-05.sql.gz 87 [root@db01 backup]# ll 88 total 1072 89 -rw-r--r-- 1 root root 1096129 Aug 5 22:19 full_2018-08-05.sql 90 91 #------------------------------------------------------------------------------- 92 # 2 分析full_2018-08-05.sql得出 93 # CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000012', MASTER_LOG_POS=137208; 94 # 说明是从mysql-bin.000012开始记录 start-position为137208 95 # 3 通过show binlog events in 'mysql-bin.000012' 得出drop开始的位置为 536332 96 # 因而语句写为: 97 # mysqlbinlog --start-position=137208 --stop-position=536332 /data/mysql/mysql-bin.000012 >/backup/inc.sql 98 #------------------------------------------------------------------------------- 99 100 [root@db01 backup]# mysqlbinlog --start-position=137208 --stop-position=536332 /data/mysql/mysql-bin.000012 >/backup/inc.sql 101 [root@db01 backup]# ll 102 total 1608 103 -rw-r--r-- 1 root root 1096129 Aug 5 22:19 full_2018-08-05.sql 104 -rw-r--r-- 1 root root 546397 Aug 5 22:27 inc.sql 105 106 107 108 #------------------------------------------------------------------------------- 109 # 进入备用数据库 恢复数据 110 #------------------------------------------------------------------------------- 111 [root@db01 tmp]# mysql -S /data/3307/mysql.sock 112 113 set sql_log_bin=0; 114 source /backup/full_2018-08-05.sql 115 source /backup/inc.sql 116 117 #------------------------------------------------------------------------------- 118 # 检查恢复后的数据 119 #------------------------------------------------------------------------------- 120 mysql> select count(*) from thur; 121 +----------+ 122 | count(*) | 123 +----------+ 124 | 239 | 125 +----------+ 126 1 row in set (0.00 sec) 127 128 #------------------------------------------------------------------------------- 129 # 将故障表导出 130 #------------------------------------------------------------------------------- 131 [root@db01 backup]# mysqldump -S /data/3307/mysql.sock backup thur >/backup/thur.sql 132 133 #------------------------------------------------------------------------------- 134 # 登录主库 导入数据thur.sql 135 # 因为是导出的单表,一定要进入数据库后恢复 use backup 136 #------------------------------------------------------------------------------- 137 [root@db01 backup]# mysql -uroot -p123 -A 138 139 mysql> use backup; 140 Database changed 141 mysql> source /backup/thur.sql; 142 Query OK, 0 rows affected (0.00 sec) 143 144 Query OK, 0 rows affected (0.00 sec) 145 146 Query OK, 0 rows affected (0.00 sec) 147 148 Query OK, 0 rows affected (0.00 sec) 149 150 #------------------------------------------------------------------------------- 151 # 检查主库数据 152 #------------------------------------------------------------------------------- 153 mysql> select count(*) from thur; 154 +----------+ 155 | count(*) | 156 +----------+ 157 | 239 | 158 +----------+ 159 1 row in set (0.01 sec)