MySQL数据库备份实例详解(5)

使用mysqldump备份时,恢复的速度完全取决于MySQL实例执行SQL的速度和服务器的IO性能,并且恢复过程是单线程的,所以对于非常大的数据集来说,要恢复的话可能需要很长的时间

演示:

把刚才的全备数据恢复到bak数据库中

创建bak_orderdb数据库

[root@localhost db_backup]# mysql -uroot -p -e"create database bak_orderdb" Enter password:

将mc_orderdb备份的数据恢复到bak数据库中

[root@localhost db_backup]# mysql -uroot -p bak_orderdb < mc_orderdb.sql Enter password: [root@localhost db_backup]#

检验恢复结果的正确性

mysql> SELECT COUNT(*) FROM mc_orderdb.order_master; +----------+ | COUNT(*) | +----------+ | 10010 | +----------+ 1 row in set (0.00 sec) mysql> SELECT COUNT(*) FROM bak_orderdb.order_master; +----------+ | COUNT(*) | +----------+ | 10010 | +----------+ 1 row in set (0.00 sec) 模拟误操作并恢复数据

假设我们现在不小心删除了mc_orderdb下的order_master中的10条数据,我们现在需要通过刚刚恢复的备份数据库把这10条数据恢复回来

mysql> DELETE FROM mc_orderdb.order_master LIMIT 10; Query OK, 10 rows affected (0.01 sec) mysql> SELECT COUNT(*) FROM mc_orderdb.order_master; +----------+ | COUNT(*) | +----------+ | 10000 | +----------+ 1 row in set (0.00 sec)

首先查出被误删的数据
SELECT a.* FROM bak_orderdb.order_master a LEFT JOIN mc_orderdb.order_master b ON a.order_id=b.order_id WHERE b.order_id IS NULL;
然后执行insert语句将查出的数据插入回去

完整语句为

INSERT INTO mc_orderdb.order_master( order_id,order_sn,customer_id,shipping_user,province,city,district,address, payment_method,order_money,district_money,shipping_money,payment_money, shipping_comp_name,shipping_sn,create_time,shipping_time,pay_time,receive_time, order_status,order_point,invoice_title,modified_time) SELECT a.* FROM bak_orderdb.order_master a LEFT JOIN mc_orderdb.order_master b ON a.order_id=b.order_id WHERE b.order_id IS NULL;

执行结果:

mysql> INSERT INTO mc_orderdb.order_master( -> order_id,order_sn,customer_id,shipping_user,province,city,district,address, -> payment_method,order_money,district_money,shipping_money,payment_money, -> shipping_comp_name,shipping_sn,create_time,shipping_time,pay_time,receive_time, -> order_status,order_point,invoice_title,modified_time) -> SELECT a.* FROM bak_orderdb.order_master a -> LEFT JOIN mc_orderdb.order_master b ON a.order_id=b.order_id -> WHERE b.order_id IS NULL; Query OK, 10 rows affected (0.03 sec) Records: 10 Duplicates: 0 Warnings: 0 mysql> SELECT COUNT(*) FROM mc_orderdb.order_master; +----------+ | COUNT(*) | +----------+ | 10010 | +----------+ 1 row in set (0.00 sec)

对于一些静态型数据我们可以这样进行,但是对于一些时刻有数据在往表里写的数据还原,就不能使用这种方式了

对于生产环境中,时刻有数据写入的表如何进行数据恢复呢?

mysqldump单表备份恢复(使用了--tab参数备份的结果集)

需要进入mysql客户端中

先恢复表结构

mysql> source /tmp/mc_orderdb/region_info.sql;

再导入数据

mysql> load data infile '/tmp/mc_orderdb/region_info.txt' info table region_info; 如何进行指定时间点的恢复

进行某一时间点的数据恢复,恢复到误操作的时间

先决条件:

具有指定时间点前的mysqldump的全备
具有全备到指定时间点的mysql二进制日志

演示

首先我们需要有个数据库的全备,此处我们对mc_orderdb 数据库进行全备

[root@localhost db_backup]# mysqldump -ubackup -p --master-data=2 --single-transaction --routines --triggers --events mc_orderdb > mc_orderdb.sql

然后我们模拟一下生产环境中对数据库的操作,这样才能看到时间点恢复的效果

我们到mc_orderdb数据库中新建一个统计表 t, uid列是用户id,cnt 是用户的总消费金额,将统计结果插入表t中后,模拟误操作,删除表t中的100行数据

mysql> use mc_orderdb 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> create table t(id int auto_increment not null,uid int,cnt decimal(8,2),primary key (id)); Query OK, 0 rows affected (0.02 sec) mysql> insert into t(uid,cnt) select customer_id,sum(order_money) from order_master group by customer_id; Query OK, 6314 rows affected (0.05 sec) Records: 6314 Duplicates: 0 Warnings: 0 mysql> select count(*) from t; +----------+ | count(*) | +----------+ | 6314 | +----------+ 1 row in set (0.00 sec) mysql> delete from t limit 100; Query OK, 100 rows affected (0.01 sec) mysql> select count(*) from t; +----------+ | count(*) | +----------+ | 6214 | +----------+ 1 row in set (0.01 sec)

先恢复一个最近的全备,进行全量数据恢复

[root@localhost db_backup]# mysql -uroot -p mc_orderdb < mc_orderdb.sql

然后查看mc_orderdb.sql文件中change master命令中

在进行这个全备时Mysql二进制日志的文件名(MASTER_LOG_FILE),以及时间点(MASTER_LOG_POS)

CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154;

此处文件名为mysql-bin.000001,日志时间点为154;

下面我们要恢复这个时间点(154)之后到第一次删除数据之前的数据

要找到这个时间点(154)之后到第一次删除数据之前的数据

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/1a2d340624be47f3124ea7a7b51e16e8.html