mysql备份与恢复实践案例

恢复误删数据
case:误操作,删除数据忘记带完整条件,执行 delete from user where age > 30 [ and sex - male ]
需求:将被删除数据还原
恢复前提:完整的数据库操作日志(binlog)
演示:
测试表数据

mysql> select * from user;
+----+------+------+------+---------------------+
| id | name | age  | sex  | create_time         |
+----+------+------+------+---------------------+
|  1 | M1   |   19 | F    | 2015-11-25 13:38:18 |
|  2 | M2   |   50 | M    | 2015-11-25 13:39:48 |
|  3 | M3   |   40 | F    | 2015-11-25 13:39:48 |
|  4 | M4   |   52 | M    | 2015-11-25 13:39:48 |
|  5 | M5   |   23 | F    | 2015-11-25 13:39:48 |
|  6 | M6   |   34 | M    | 2015-11-25 13:39:48 |
+----+------+------+------+---------------------+
6 rows in set (0.00 sec)

模拟误删数据


mysql> delete from user where sex='F';
Query OK, 3 rows affected (0.13 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from user;
+----+------+------+------+---------------------+
| id | name | age  | sex  | create_time         |
+----+------+------+------+---------------------+
|  2 | M2   |   50 | M    | 2015-11-25 13:39:48 |
|  4 | M4   |   52 | M    | 2015-11-25 13:39:48 |
|  6 | M6   |   34 | M    | 2015-11-25 13:39:48 |
+----+------+------+------+---------------------+
3 rows in set (0.00 sec)

查看binlog日志

[root@miles mysql]# mysqlbinlog -vv binlog.000002
...
### DELETE FROM `db1`.`user`
### WHERE
###   @1=1 /* INT meta=0 nullable=0 is_null=0 */
###   @2='M1' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
###   @3=19 /* INT meta=0 nullable=1 is_null=0 */
###   @4='F' /* VARSTRING(18) meta=18 nullable=1 is_null=0 */
###   @5=1448444542 /* TIMESTAMP meta=0 nullable=0 is_null=0 */
### DELETE FROM `db1`.`user`
### WHERE
###   @1=3 /* INT meta=0 nullable=0 is_null=0 */
###   @2='M3' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
###   @3=40 /* INT meta=0 nullable=1 is_null=0 */
###   @4='F' /* VARSTRING(18) meta=18 nullable=1 is_null=0 */
###   @5=1448444550 /* TIMESTAMP meta=0 nullable=0 is_null=0 */
### DELETE FROM `db1`.`user`
### WHERE
###   @1=5 /* INT meta=0 nullable=0 is_null=0 */
###   @2='M5' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
###   @3=23 /* INT meta=0 nullable=1 is_null=0 */
###   @4='F' /* VARSTRING(18) meta=18 nullable=1 is_null=0 */
###   @5=1448444550 /* TIMESTAMP meta=0 nullable=0 is_null=0 */
...

根据日志生成反转sql语句

mysql> desc user;
+-------------+-------------+------+-----+-------------------+-----------------------------+
| Field       | Type        | Null | Key | Default           | Extra                       |
+-------------+-------------+------+-----+-------------------+-----------------------------+
| id          | int(10)     | NO   | PRI | NULL              | auto_increment              |
| name        | varchar(30) | NO   |     | NULL              |                             |
| age         | int(3)      | YES  |     | NULL              |                             |
| sex         | varchar(6)  | YES  |     | NULL              |                             |
| create_time | timestamp   | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-------------+-------------+------+-----+-------------------+-----------------------------+
5 rows in set (0.01 sec)

mysql> insert into user values (1,'M1',19,'F',from_unixtime(1448444542));
Query OK, 1 row affected (0.01 sec)
...

恢复误删表、库
case:业务被黑,表被删除了drop table used
需求:将表恢复
前提:备份+备份以来完整binlog
演示:

测试表数据


mysql> select * from test;
+------+------+
| id   | name |
+------+------+
|    1 | M1   |
|    2 | M2   |
|    3 | M3   |
|    4 | M4   |
|    5 | M5   |
+------+------+
5 rows in set (0.00 sec)

备份数据库

[root@miles ~]# innobackupex --user=root --password=beijing /home/mysql/backup/
...
151127 19:32:14 Executing UNLOCK TABLES
151127 19:32:14 All tables unlocked
151127 19:32:14 Backup created in directory '/home/mysql/backup//2015-11-27_19-32-07'
MySQL binlog position: filename 'binlog.000003', position '961'
151127 19:32:14 [00] Writing backup-my.cnf
151127 19:32:14 [00]        ...done
151127 19:32:15 [00] Writing xtrabackup_info
151127 19:32:15 [00]        ...done
xtrabackup: Transaction log of lsn (449989787) to (449989787) was copied.
151127 19:32:15 completed OK!

模拟数据操作

mysql> insert into test values (6,'M6'),(7,'M7'),(8,'M8'),(9,'M9'),(10,'M10');
Query OK, 5 rows affected (0.01 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> select count(*) from test;
+----------+
| count(*) |
+----------+
|       10 |
+----------+
1 row in set (0.00 sec)

mysql> drop table test;
Query OK, 0 rows affected (0.01 sec)

还原数据备份

[root@miles ~]# innobackupex --apply-log  /home/mysql/backup/2015-11-27_19-32-07

利用还原出来的数据重新启动一个实例,然后在新启动的实例里应用之前的日志

[root@miles backup]# mv 2015-11-27_19-32-07 testEnv3309

[root@miles backup]# cp /etc/my.cnf testEnv3309/

[root@miles backup]# cd testEnv3309/

[root@miles testEnv3309]# mv my.cnf my3309.cnf

[root@miles testEnv3309]# vi my3309.cnf
port=3309
全局替换文件目录为/home/mysql/backup/testEnv3309/
:%s#/data/mysql#/home/mysql/backup/testEnv3309#g

启动新实例

/usr/local/mysql/bin/mysqld_safe --defaults-file=/home/mysql/backup/testEnv3309/my3309.cnf  &

[root@miles ~]# ps -ef |grep 3309
root      12145  12083  0 10:40 pts/0    00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --defaults-file=/home/mysql/backup/testEnv3309/my3309.cnf
mysql     12429  12145  0 10:40 pts/0    00:00:00 /usr/local/mysql/bin/mysqld --defaults-file=/home/mysql/backup/testEnv3309/my3309.cnf --basedir=/usr/local/mysql --datadir=/home/mysql/backup/testEnv3309 --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/home/mysql/backup/testEnv3309/log/error.log --pid-file=/home/mysql/backup/testEnv3309/mysqld.pid --socket=/home/mysql/backup/testEnv3309/mysql.sock

查看备份信息

[root@miles testEnv3309]# more xtrabackup_binlog_info
binlog.000003   961

查看binlo信息

[root@miles mysql]# mysqlbinlog -vv binlog.000003
...
# at 1187
#151127 19:34:51 server id 1  end_log_pos 1292  Query   thread_id=5     exec_time=0     error_code=0
SET TIMESTAMP=1448624091/*!*/;
DROP TABLE `test` /* generated by server */

基于日志恢复

[root@miles mysql]# mysqlbinlog -vv --start-position=961 --stop-position=1187 binlog.000003|mysql -uroot -pbeijing --socket=/home/mysql/backup/testEnv3309/mysql.sock

查看数据库恢复情况

[root@miles testEnv3309]# mysql -uroot -p --socket=/home/mysql/backup/testEnv3309/mysql.sock db1

mysql> select count(*) from test;
+----------+
| count(*) |
+----------+
|       10 |
+----------+
1 row in set (0.00 sec)

导出test表并在正式库恢复

[root@miles mysql]# mysqldump --defaults-file=/home/mysql/backup/testEnv3309/my3309.cnf -uroot -pbeijing  --single-transaction --socket=/home/mysql/backup/testEnv3309/mysql.sock db1 test > /home/mysql/backup/db1_test.sql
--在正式库恢复表test
mysql> source /home/mysql/backup/db1_test.sql 

或者

[root@miles log]# mysqldump -uroot -pbeijing --socket=/home/mysql/backup/testEnv3309/mysql.sock --single-transaction db1 test |mysql -uroot -p --socket=/data/mysql/mysql.sock db1

将数据库恢复到指定时间点
case:游戏bug,导致很多玩家利用bug刷金币
需求:游戏回滚,数据库也需要回滚
前提:有效备份+完整的数据库操作日志(binlog)
演示:

全量备份

[root@miles log]# innobackupex --user=root --password=beijing /home/mysql/backup/
...151129 15:53:36 Executing UNLOCK TABLES
151129 15:53:36 All tables unlocked
151129 15:53:36 Backup created in directory '/home/mysql/backup//2015-11-29_15-53-30'
MySQL binlog position: filename 'binlog.000005', position '887'
151129 15:53:36 [00] Writing backup-my.cnf
151129 15:53:36 [00]        ...done
151129 15:53:36 [00] Writing xtrabackup_info
151129 15:53:36 [00]        ...done
xtrabackup: Transaction log of lsn (449994896) to (449994896) was copied.
151129 15:53:36 completed OK!

模拟备份后发生的操作

mysql> select * from test;
+------+------+
| id   | name |
+------+------+
|    1 | M1   |
|    2 | M2   |
|    3 | M3   |
|    4 | M4   |
|    5 | M5   |
|    6 | M6   |
|    7 | M7   |
|    8 | M8   |
|    9 | M9   |
|   10 | M10  |
+------+------+
10 rows in set (0.00 sec)

mysql> insert into test values(11,'M11'),(12,'M12'),(13,'M13');
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> drop database db1;
Query OK, 2 rows affected (0.02 sec)

还原备份

[root@miles log]# innobackupex --apply-log /home/mysql/backup/2015-11-29_15-53-30

利用还原数据库重新启动一个实例,并进行恢复

[root@miles backup]# mv 2015-11-29_15-53-30 testEnv3310
[root@miles backup]# cp testEnv3309/my3309.cnf   testEnv3310/my3310.cnf
[root@miles backup]# vi testEnv3310/my3310.cnf
:%s/3309/3310/g

查看备份信息

[root@miles testEnv3310]# more xtrabackup_binlog_info
binlog.000005   887

[root@miles testEnv3310]# mysqlbinlog -vv --start-position=887 binlog.000005
# at 954
#151129 15:55:54 server id 1  end_log_pos 1071  Query   thread_id=2     exec_time=0     error_code=0
use `db1`/*!*/;
SET TIMESTAMP=1448783754/*!*/;
insert into test values(11,'M11'),(12,'M12'),(13,'M13')
/*!*/;
# at 1071
#151129 15:55:54 server id 1  end_log_pos 1098  Xid = 94
COMMIT/*!*/;
# at 1098
#151129 15:56:17 server id 1  end_log_pos 1177  Query   thread_id=2     exec_time=0     error_code=0
SET TIMESTAMP=1448783777/*!*/;
drop database db1

恢复到指定时间点

[root@miles testEnv3310]# mysqlbinlog --start-position=887 --stop-datetime="2015-11-29 15:56:17"  binlog.000005 |  mysql -uroot -pbeijing --socket=/home/mysql/backup/testEnv3310/mysql.sock 

查看恢复数据

[root@miles mysql]# mysql -uroot -pbeijing --socket=/home/mysql/backup/testEnv3310/mysql.sock db1

mysql> select count(*) from test;
+----------+
| count(*) |
+----------+
|       13 |
+----------+
1 row in set (0.00 sec)

mysql> select * from test;
+------+------+
| id   | name |
+------+------+
|    1 | M1   |
|    2 | M2   |
|    3 | M3   |
|    4 | M4   |
|    5 | M5   |
|    6 | M6   |
|    7 | M7   |
|    8 | M8   |
|    9 | M9   |
|   10 | M10  |
|   11 | M11  |
|   12 | M12  |
|   13 | M13  |
+------+------+
13 rows in set (0.00 sec)
时间: 2025-01-27 21:53:43

mysql备份与恢复实践案例的相关文章

DockOne微信分享(一二一):喜马拉雅FM测试环境的Docker化实践案例

本文讲的是DockOne微信分享(一二一):喜马拉雅FM测试环境的Docker化实践案例[编者的话]随着容器技术的流行,作为线上应用Docker的铺垫,喜马拉雅FM从16年开始推进测试环境Docker化.本次分享将重点为大家介绍我们在Docker化的过程中如何进行技术选型.环境搭建,特别是实践中碰到的一些问题及其解决方案. [3 天烧脑式 Docker 训练营 | 上海站]随着Docker技术被越来越多的人所认可,其应用的范围也越来越广泛.本次培训我们理论结合实践,从Docker应该场景.持续部

360图片搜索 瀑布流布局的开发实践案例

开发实践案例-瀑布流布局"> 瀑布流的布局方式展现的内容通常是扁平化.琐碎的东西.首先吸引人的应该是图片,并且图片是那种参差不齐的,如果瀑布流中文字过多,会给人很杂乱的感觉,所以瀑布流更适合单纯的图片浏览. 前不久公司上线的项目–360图片搜索的美女秀场频道,就用到了瀑布流的布局方式,这种纯粹的看美女图片的页面用瀑布流还是挺合适的. 以前并未开发过瀑布流布局的网站,第一个想到的实现方式就是多列浮动,从表面上看这种方式要简单. 传统的定位布局方式 但是,目前主流的瀑布流布局都是采用定位的方式

MySQL 备份与恢复

MySQL备份与恢复        数据库的备份与恢复一直都是 DBA 工作中最为重要的部分之一,也是基本工作之一. 任何正式环境的数据库都必须有完整的备份计划和恢复测试,本章内容将主要介绍 MySQL 数据库的备份与恢复相关内容. 1.数据库备份使用场景 你真的明白了自己所做的数据库备份是要面对什么样的场景的吗?       我想任何一位维护过数据库的人都知道数据库是需要备份的,也知道备份数据库是数据 库维护必不可少的一件事情.那么是否每一个人都知道自己所做的备份到底是为了应对哪 些场景的呢?

2017年度TOP 10大数据应用最佳实践 案例征集活动最新启动

2017年5月18日上午,CCF大数据专家委员会召开新闻会,正式发布和启动了"2017年度TOP10大数据应用最佳实践案例征集"活动. CCF大数据专家委员会副秘书长.北京启明星辰信息技术有限公司首席战略官潘柱廷(左),中国科学院计算技术研究所副研究员查礼(右) 发布会上,CCF大数据专家委员会副秘书长.北京启明星辰信息技术有限公司首席战略官潘柱廷,中国科学院计算技术研究所副研究员查礼代表活动发起方,向现场数十家记者阐述了2017年大数据技术发展的现状及未来趋势,并就本次最佳实践案例征

vue.js+boostrap项目实践(案例详解)_javascript技巧

一.为什么要写这篇文章 最近忙里偷闲学了一下vue.js,同时也复习了一下boostrap,发现这两种东西如果同时运用到一起,可以发挥很强大的作用,boostrap优雅的样式和丰富的组件使得页面开发变得更美观和更容易,同时vue.js又是可以绑定model和view(这个相当于MVC中的,M和V之间的关系),使得对数据变换的操作变得更加的简易,简化了很多的逻辑代码. 二.学习这篇文章需要具备的知识 1.需要有vue.js的知识 2.需要有一定的HTML.CSS.JavaScript的基础知识 3

MySQL备份与恢复之热备(3)_Mysql

       在上两篇文章(MySQL备份与恢复之冷备,MySQL备份与恢复之真实环境使用冷备)中,我们提到了冷备和真实环境中使用冷备.那从这篇文章开始我们看下热备.显然热备和冷备是两个相对的概念,冷备是把数据库服务,比如MySQL,Oracle停下来,然后使用拷贝.打包或者压缩命令对数据目录进行备份:那么我们很容易想到热备就是在MySQL或者其他数据库服务在运行的情况下进行备份.但是,这里存在一个问题,因为生产库在运行的情况下,有对该库的读写,读写频率有可能高,也可能低,不管频率高低,总会就会

云计算逐步落地 公有云实践案例凤毛麟角

可以看出,覆盖全国的无线.http://www.aliyun.com/zixun/aggregation/38631.html">有线网络是运营商开展公共服务的坚实基础,为了保证利润率,与政府.社会机构联合推出公共服务将是运营商尝试公有云的优先选择,而这也将成为其他运营商在2012年推广"公有云"服务的有力参考. 国内云计算产业在2011年的发展令人欣慰.这一年,我们看到了各地不断涌现的云产业基地,腾讯.盛大等互联网公司推出的"云服务",以及电信运营

Mysql性能优化案例研究-覆盖索引和SQL_NO_CACHE_Mysql

场景 产品中有一张图片表pics,数据量将近100万条,有一条相关的查询语句,由于执行频次较高,想针对此语句进行优化 表结构很简单,主要字段: 复制代码 代码如下: user_id 用户ID picname 图片名称 smallimg 小图名称 一个用户会有多条图片记录,现在有一个根据user_id建立的索引:uid,查询语句也很简单:取得某用户的图片集合: 复制代码 代码如下: select picname, smallimg from pics where user_id = xxx; 优化

中国互联网大会面向社会征集两化融合最佳实践案例

传统企业如何找准信息化的脉门?互联网企业怎样在两化融合大潮中找到商机?两化融合的道路走了多年,如何在这场潮流中抓住契机智慧转型?中国互联网大会(http://www.2011cic.cn/)特设两化融合--企业信息化论坛,以上问题为您逐一揭晓! 两化融合--企业信息化论坛是中国互联网大会针对两化融合趋势,首次打造的企业信息化高端论坛,论坛将云集国内老牌传统企业和互联网企业,目前拟邀请宝钢.吉利.方正.金蝶.青岛红领.维尚家具网等传统行业企业和西门子.联想.用友.敦煌网等信息化建设领先企业出席.