使用mysqldump进行MariaDB 的备份(二)

2015-07-23 18:08:11 · 作者: · 浏览: 5
|? ? ? 533 |? ? #当前日志的记录位置
+------------------+-----------+
3rows in set (0.00 sec)
MariaDB[(none)]> show binlog events in 'mysql-bin.000003'\G;
***************************5. row ***************************
? Log_name: mysql-bin.000005
? ? ? ? Pos: 446
?Event_type: Query
? Server_id: 1
End_log_pos:533
? ? ? Info: DROP database hellodb? ? ? #记录的删除语句
5rows in set (0.00 sec)
?
ERROR:No query specified


由于是整个hellodb数据库遭到误删除,所以需要用一开始的完全备份文件,以及第一天的增量备份文件,恢复hellodb数据库和第一天对数据库进行修改的内容。
第二天对数据库进行修改的内容恢复:如果直接把当天的二进制日志导入到数据库,由于数据库中包含了删除语句,所以数据库还是会被删除;所以在导入第二天二进制日志时,需要删除日志中的DROP语句。
?
将第二天的二进制日志文件转换成sql文件,放到backup目录下
[root@MariaDB~]# mysqlbinlog /backup/bin-log/mysql-bin.000003 > /backup/2.sql


打开2.sql文件可以看到DROP语句,删除这个语句
# at446
#15061612:15:22 server id 1? end_log_pos 533? Query? thread_id=20? ? exec_time=0? ? error_code=0
SETTIMESTAMP=1434428122/*!*/;
DROP database hellodb? #删除或者注释这一行


恢复过程:
恢复之前为了避免产生没有用的二进制日志,可以关闭二进制日志的记录
MariaDB[(none)]> SET SESSION sql_log_bin=0;
将第一次的完全备份数据导入到数据库
MariaDB [hellodb]> SOURCE /backup/hellodb-2015-06-16.sql;


查看数据库已经导入,但是tb1表不存在
MariaDB[(none)]> use hellodb;
Databasechanged
MariaDB[hellodb]> show tables;
+-------------------+
|Tables_in_hellodb |
+-------------------+
|classes? ? ? ? ? |
|coc? ? ? ? ? ? ? |
|courses? ? ? ? ? |
|scores? ? ? ? ? ? |
|students? ? ? ? ? |
|teachers? ? ? ? ? |
|toc? ? ? ? ? ? ? |
+-------------------+


导入第一天增量备份的1.sql文件。
MariaDB [hellodb]> SOURCE /backup/1.sql;


查看tb1表,发现第一天插入的数据都存在
MariaDB[hellodb]> select * from tb1;
+------+
|id? |
+------+
|? ? 1 |
|? ? 2 |
|? ? 3 |
+------+


导入当天的2.sql文件
MariaDB [hellodb]> SOURCE /backup/2.sql;


查看数据已经完全恢复
MariaDB[hellodb]> select * from tb1;
+------+
|id? |
+------+
|? ? 1 |
|? ? 2 |
|? ? 3 |
|? 21 |
|? 22 |
|? 23 |
+------+


恢复完成,启用记录二进制日志
MariaDB[hellodb]> SET SESSION sql_log_bin=1;


特别说明:如果在恢复中关闭二进制日志,导入数据必须在Mariadb命令行导入,如果在shell命令行导入还是会记录二进制日志的。


全库的备份恢复
备份
第一次完全备份,备份时锁定表,并滚动二进制日志
[root@MariaDB ~]# mysqldump -A -u root -p--lock-all-tables --flush-logs --master-data=2 > /backup/ALL-`date +%F`.sql
Enter password:
[root@MariaDB ~]# ll /backup/
total 532
-rw-r--r-- 1 root root? ? 1980 Jun 16 00:46 1.sql
-rw-r--r-- 1 root root? ? 1957 Jun 16 00:52 2.sql
-rw-r--r-- 1 root root? 521774 Jun 16 01:04ALL-2015-06-16.sql
drwxr-xr-x 2 mysql mysql? 4096 Jun 16 01:04 bin-log
-rw-r--r-- 1 root root? ? 7950 Jun 16 00:43hellodb-2015-06-16.sql


由于备份的时候滚动了二进制日志,所以备份之后所有对数据库产生更改的操作都会记录到mysql-bin.000004中。
MariaDB [hellodb]> show master logs;
+------------------+-----------+
| Log_name? ? ? ? | File_size |
+------------------+-----------+
| mysql-bin.000001 |? ? ? 288 |
| mysql-bin.000002 |? ? ? 577 |
| mysql-bin.000003 |? ? ? 8833 |
| mysql-bin.000004 |? ? ? 245 |
+------------------+-----------+
4 rows in set (0.00 sec)


备份完成的当天做了一些操作。
MariaDB[hellodb]> delete from tb1 where id=21;
MariaDB[hellodb]> delete from tb1 where id=22;
MariaDB[hellodb]> select * from tb1;
+------+
|id? |
+------+
|? ? 1 |
|? ? 2 |
|? ? 3 |
|? 23 |
+------+


第一天??量备份
当天的所有对数据库进行更改的语句都会记录到二进制日志文件中,只需要滚动二进制日志,把二进制日志进行备份即可,二进制滚动之后,第二天的所有对数据库进行更改的语句,都会记录到新的二进制日志文件中。
MariaDB [hellodb]> flush logs;
MariaDB [hellodb]> show master logs;
+------------------+-----------+
| Log_name? ? ? ? | File_size |
+------------------+-----------+
| mysql-bin.000001 |? ? ? 288 |
| mysql-bin.000002 |? ? ? 577 |
| mysql-bin.000003 |? ? ? 8833 |
| mysql-bin.000004 |? ? ? 670 |
| mysql-bin.000005 |? ? ? 245 |
+------------------+-----------+
5 rows in set (0.00 sec)


将第一天的二进制日志文件