Mysql备份和恢复

Mysql备份和恢复

一:mysqldump常见备份和恢复方式
二:完全恢复
三:不完全恢复
(1) 基于时间点恢复
(2) 基于位置恢复 

一:mysqldump常见备份和恢复方式
逻辑备份工具:mysqldump
查看帮助信息:mysqldump --help 

创建测试数据库
mysql> create database test;
mysql> create table emp(a int,b varchar(10));
insert into emp values(1,'z1');
insert into emp values(2,'z2');
insert into emp values(3,'z3');
mysql> create table dept(a int,b varchar(10));
insert into dept values(1,'a1');
insert into dept values(2,'a2');
insert into dept values(3,'a3');

---1 备份所有数据库
mysqldump -uroot -p --all-databases > D:\mysql\backup\all.sql
---2 备份数据库test 
mysqldump -uroot -p test > D:\mysql\backup\test.sql 
---3 备份数据库test下的表emp
mysqldump -uroot -p test emp > D:\mysql\backup\emp.sql 
---4 备份备份数据库test下的表emp和dept
mysqldump -uroot -p test emp dept > D:\mysql\backup\emp_dept.sql
---5 备份数据库test下的所有表为逗号分割的文本,备份到D:\mysql\backup,需要提前设置好secure-file-priv参数;
mysqldump -uroot -p -T D:\mysql\backup test --fields-terminated-by ','

二:完全恢复

---16:52备份
mysqldump -uroot -p -l -F test > test.sql 
其中-l参数表示给所有表加读锁,-F表示生成一个新的日志文件,此时,test中emp表的数据如下:
mysql> select * from emp order by a;
+------+------+
| a    | b    |
+------+------+
|    1 | z1   |
|    2 | z2   |
|    3 | z3   |
|    4 | z4   |
+------+------+
4 rows in set (0.02 sec)

---16:57点插入新数据:
insert into emp values(5,'z5');
insert into emp values(6,'z6');
mysql> select * from emp order by a;
+------+------+
| a    | b    |
+------+------+
|    1 | z1   |
|    2 | z2   |
|    3 | z3   |
|    4 | z4   |
|    5 | z5   |
|    6 | z6   |
+------+------+
6 rows in set (0.00 sec)

---17点,数据库突然故障,数据无法访问。需要恢复备份:
mysql> flush logs;  ---手动切一下日志,将下面数据库恢复产生的SQL写入到下一个日志组里;
mysql -uroot -p test < test.sql 
恢复后的数据如下:
---只恢复了备份时刻的数据
mysql> select * from emp order by a;
+------+------+
| a    | b    |
+------+------+
|    1 | z1   |
|    2 | z2   |
|    3 | z3   |
|    4 | z4   |
+------+------+
4 rows in set (0.00 sec)
---使用mysqlbinlog恢复自mysqldump备份以来的BINLOG
mysql> show master status;
---file mysql-bin.000005
D:\mysql\mysql-5.7.22-winx64\bin>mysqlbinlog D:\mysql\mysql-5.7.22-winx64\data\mysql-bin.000004|mysql -u root -p test
Enter password: ***
---查询完全恢复的数据如下:
mysql> use test
Database changed
mysql> select * from emp;
+------+------+
| a    | b    |
+------+------+
|    1 | z1   |
|    2 | z2   |
|    3 | z3   |
|    4 | z4   |
|    5 | z5   |
|    6 | z6   |
+------+------+
6 rows in set (0.00 sec)

三:不完全恢复
(1) 基于时间点恢复
(2) 基于位置恢复 

(1) 基于时间点恢复
---不完全恢复 
恢复到无操作之前的状态,然后跳过误操作语句,在恢复后面执行的语句,完成我们的恢复
---备份 
---9:50 
mysqldump -uroot -p -l -F test > test0621.sql 
其中-l参数表示给所有表加读锁,-F表示生成一个新的日志文件,此时,test中dept表的数据如下:
mysql> use test
Database changed
mysql> select * from dept;
+------+------+
| a    | b    |
+------+------+
|    1 | a1   |
|    2 | a2   |
|    3 | a3   |
+------+------+
3 rows in set (0.00 sec)

---9:56
mysql>
insert into dept values(4,'a4');
insert into dept values(5,'a5');
insert into dept values(6,'a6');
mysql> select * from dept;
+------+------+
| a    | b    |
+------+------+
|    1 | a1   |
|    2 | a2   |
|    3 | a3   |
|    4 | a4   |
|    5 | a5   |
|    6 | a6   |
+------+------+
6 rows in set (0.00 sec)

---10:00
mysql> delete from dept;
Query OK, 6 rows affected (0.09 sec)

mysql> select * from dept;
Empty set (0.00 sec)

---10:03
mysql> create table t1(a int,b varchar(10));
insert into t1 values(1,'c1');
insert into t1 values(2,'z2');
insert into t1 values(3,'z3');
mysql> select * from t1;
+------+------+
| a    | b    |
+------+------+
|    1 | c1   |
|    2 | z2   |
|    3 | z3   |
+------+------+
3 rows in set (0.00 sec)

mysql> flush logs;  ---手动切一下日志,将下面数据库恢复产生的SQL写入到下一个日志组里;
mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       177 |
| mysql-bin.000002 |       201 |
| mysql-bin.000003 |      5599 |
| mysql-bin.000004 |       721 |
| mysql-bin.000005 |      2876 |
| mysql-bin.000006 |       201 |
| mysql-bin.000007 |      2237 |
| mysql-bin.000008 |       154 |
+------------------+-----------+
8 rows in set (0.00 sec)

mysql -uroot -p test < test0621.sql 
mysql> select * from dept;
+------+------+
| a    | b    |
+------+------+
|    1 | a1   |
|    2 | a2   |
|    3 | a3   |
+------+------+
3 rows in set (0.00 sec)

mysql> select * from t1;
+------+------+
| a    | b    |
+------+------+
|    1 | c1   |
|    2 | z2   |
|    3 | z3   |
+------+------+
3 rows in set (0.00 sec)

如果上午10点发送误操作,可以用以下语句用备份和BINLOG将数据恢复到故障前:
mysqlbinlog --stop-datetime="2018-06-21 09:57:10" D:\mysql\mysql-5.7.22-winx64\data\mysql-bin.000007| mysql -u root -p test
跳过故障时的时间点,继续执行后面的BINLOG,完成恢复。
mysqlbinlog --start-datetime="2018-06-21 10:02:00" D:\mysql\mysql-5.7.22-winx64\data\mysql-bin.000007| mysql -u root -p test
Enter password: ***
ERROR 1050 (42S01) at line 26: Table 't1' already exists

mysql> select * from dept;
+------+------+
| a    | b    |
+------+------+
|    1 | a1   |
|    2 | a2   |
|    3 | a3   |
|    4 | a4   |
|    5 | a5   |
|    6 | a6   |
+------+------+
6 rows in set (0.00 sec)

(2) 基于位置恢复 
和基于时间点的恢复类似,但是更精确,因为同一个时间点可能有很多条SQL语句同时执行。恢复的操作步骤如下。
mysql> create table t2(a int,b varchar(10));
insert into t2 values(1,'c1');
insert into t2 values(2,'z2');
insert into t2 values(3,'z3');
mysql> select * from t2;
+------+------+
| a    | b    |
+------+------+
|    1 | c1   |
|    2 | z2   |
|    3 | z3   |
+------+------+
3 rows in set (0.00 sec)

---10:32
mysqldump -uroot -p -l -F test > test0621a.sql

---10:44
insert into t2 values(4,'a4');
insert into t2 values(5,'a5');
insert into t2 values(6,'a6');

mysql> select * from t2;
+------+------+
| a    | b    |
+------+------+
|    1 | c1   |
|    2 | z2   |
|    3 | z3   |
|    4 | a4   |
|    5 | a5   |
|    6 | a6   |
+------+------+
6 rows in set (0.00 sec)

---10:47
mysql> delete from t2;
Query OK, 6 rows affected (0.13 sec)

mysql> select * from t2;
Empty set (0.00 sec)

---10:50
insert into t1 values(4,'c4');
insert into t1 values(5,'c5');
insert into t1 values(6,'c6');

mysql> flush logs;  ---手动切一下日志,将下面数据库恢复产生的SQL写入到下一个日志组里;
Query OK, 0 rows affected (0.21 sec)

mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       177 |
| mysql-bin.000002 |       201 |
| mysql-bin.000003 |      5599 |
| mysql-bin.000004 |       721 |
| mysql-bin.000005 |      2876 |
| mysql-bin.000006 |       201 |
| mysql-bin.000007 |      2237 |
| mysql-bin.000008 |      4131 |
| mysql-bin.000009 |      2054 |
| mysql-bin.000010 |       154 |
+------------------+-----------+
10 rows in set (0.00 sec)

mysql -uroot -p test < test0621a.sql 
mysql> use test
Database changed

mysql> select * from t2;
+------+------+
| a    | b    |
+------+------+
|    1 | c1   |
|    2 | z2   |
|    3 | z3   |
+------+------+
3 rows in set (0.00 sec)

mysql> select * from t1;
+------+------+
| a    | b    |
+------+------+
|    1 | c1   |
|    2 | z2   |
|    3 | z3   |
+------+------+
3 rows in set (0.00 sec)
 
mysql> show binlog events in 'mysql-bin.000009';
+------------------+------+----------------+-----------+-------------+---------------------------------------+
| Log_name         | Pos  | Event_type     | Server_id | End_log_pos | Info                                  |
+------------------+------+----------------+-----------+-------------+---------------------------------------+
| mysql-bin.000009 |    4 | Format_desc    |         1 |         123 | Server ver: 5.7.22-log, Binlog ver: 4 |
......
| mysql-bin.000009 | 1068 | Table_map      |         1 |        1116 | table_id: 114 (test.t2)               |
| mysql-bin.000009 | 1116 | Delete_rows    |         1 |        1199 | table_id: 114 flags: STMT_END_F       |
......

mysqlbinlog --start-datetime="2018-06-21 10:01:00" --stop-datetime="2018-06-21 10:55:00" D:\mysql\mysql-5.7.22-winx64\data\mysql-bin.000009 > sql_resore.sql 
---sql_resore.sql
# at 1116
#180621 10:47:56 server id 1  end_log_pos 1199 CRC32 0xa6883df9 Delete_rows: table id 114 flags: STMT_END_F

BINLOG '
3BErWxMBAAAAMAAAAFwEAAAAAHIAAAAAAAEABHRlc3QAAnQyAAIDDwIeAAOaVcAI
3BErWyABAAAAUwAAAK8EAAAAAHIAAAAAAAEAAgAC//wBAAAAAmMx/AIAAAACejL8AwAAAAJ6M/wE
AAAAAmE0/AUAAAACYTX8BgAAAAJhNvk9iKY=
'/*!*/;
# at 1199
#180621 10:47:56 server id 1  end_log_pos 1230 CRC32 0x9e871466 Xid = 264
COMMIT/*!*/;

找出误删除语句前后位置,分别是1116到1199;

恢复
mysqlbinlog --stop-position="1116" D:\mysql\mysql-5.7.22-winx64\data\mysql-bin.000009 |mysql -u root -p test 
mysqlbinlog --start-position="1199" D:\mysql\mysql-5.7.22-winx64\data\mysql-bin.000009 |mysql -u root -p test 

mysql> use test
Database changed
mysql> select * from t1;
+------+------+
| a    | b    |
+------+------+
|    1 | c1   |
|    2 | z2   |
|    3 | z3   |
|    4 | c4   |
|    5 | c5   |
|    6 | c6   |
+------+------+
6 rows in set (0.00 sec)

mysql> select * from t2;
+------+------+
| a    | b    |
+------+------+
|    1 | c1   |
|    2 | z2   |
|    3 | z3   |
|    4 | a4   |
|    5 | a5   |
|    6 | a6   |
+------+------+
6 rows in set (0.00 sec)

------参考《深入浅出mysql》

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29785807/viewspace-2156430/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29785807/viewspace-2156430/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值