使用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)之后到第一次删除数据之前的数据