在线备份简单的来讲分为:全备份和增量备份,下面我们讲解一下mysqlinnodb引擎的数据库备份:
二、利用mysqldump实现的全备份和增量备份:
1.利用mysql自带的工具mysqldump来备份:
mysqldump -uroot -p --all-databases --flush-logs --master-data=2 --single-transaction > full_back.sql
关键参数的含义:
--all-databases , -A
导出全部数据库。
--flush-logs
开始导出之前刷新日志。
请注意:假如一次导出多个数据库(使用选项--databases或者--all-databases),将会逐个数据库刷新日志。除使用--lock-all-tables或者--master-data外
。在这种情况下,日志将会被刷新一次,相应的所以表同时被锁定。因此,如果打算同时导出和刷新日志应该使用--lock-all-tables 或者--master-data
和--flush-logs。
--master-data
该选项将binlog的位置和文件名追加到输出文件中。如果为1,将会输出CHANGE MASTER 命令;如果为2,输出的CHANGE MASTER命令前添加注释信息。该选项
将打开--lock-all-tables 选项,除非--single-transaction也被指定(在这种情况下,全局读锁在开始导出时获得很短的时间;其他内容参考下面的--
single-transaction选项)。该选项自动关闭--lock-tables选项。
mysqldump -uroot -p --host=localhost --all-databases --master-data=1;
mysqldump -uroot -p --host=localhost --all-databases --master-data=2;
--single-transaction
该选项在导出数据之前提交一个BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于多版本存储引擎,仅InnoDB。本选项和--lock-tables 选项是互斥的,因为LOCK TABLES 会使任何挂起的事务隐含提交。要想导出大表的话,应结合使用--quick 选项。
mysqldump提供在线逻辑备份,我们在备份的时候使用single-transaction参数的话,MYSQL为我们提供一致性地读,并且保证mysqldump所看见的数据不会更改。(其它客户端对InnoDB表进行的更改不会被mysqldump进程看见)该参数自动关闭--lock-tables。
如果我们还有其它类型的表,我们必须假定在备份过程中它们不会更改。
--master-data=2起到的作用
grep -C 10 CHANGE full_back.sql | more(下面的内容在备份文件的前面出现)
-------------------------------------------------------------------------------------------
-- Position to start replication or point-in-time recovery from
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000078', MASTER_LOG_POS=107;
-------------------------------------------------------------------------------------------
--flush-logs起到的作用,产生了新的binlog文件
-------------------------------------------------------------------------------------------
-rw-rw---- 1 mysql mysql 644406800 Apr 23 11:11 mysql-bin.000077
-rw-rw---- 1 mysql mysql 107 Apr 23 11:11 mysql-bin.000078
-------------------------------------------------------------------------------------------
2.增量备份:
增量备份可以利用flush log,产生新的binlog,保存(拷贝备份)新binlog之前的binlog文件,如果binlog数据量小的话,可以使一个binlog,如果多的话,就会产生多个binlog,不过没有关系,我们可以安装时间来拷贝产生的binlog文件。
在bird数据库的Customer表中插入一行数据:
mysql> insert into Customer(ID,First_Name,Last_Name,Addr,City,Country,Birth_Date) values (3,'wen','zhao','king
street','shanghai','China','1985-09-21');
Query OK, 1 row affected (0.07 sec
mysql>
flush log:
mysqladmin -uroot -p flush-logs
可以看到产生的新log:
-rw-rw---- 1 mysql mysql 644406800 Apr 23 11:11 mysql-bin.000077
-rw-rw---- 1 mysql mysql 452 Apr 23 14:03 mysql-bin.000078
-rw-rw---- 1 mysql mysql 107 Apr 23 14:03 mysql-bin.000079
查看插入的数据是否在mysql-bin.000078中(mysqlbinlog mysql-bin.000078 | more),经查看插入的语句确实在mysql-bin.000078里面。
3.测试恢复,全备份的频率可每周做一次,增量备份可以每天做一次
如果机器出现了故障,或者数据库出现了问题,不能修复的情况下,就需要导入全备份和增量备份。用test库进行测试:
mysql> create table kehu(id int, name1 varchar(20),city varchar(20));
Query OK, 0 rows affected (0.06 sec)
mysql> insert into kehu(id,name1,city)values(1,'xiaoming','beijing');
Query OK, 1 row affected (0.04 sec)
mysql> select * from kehu;
+------+----------+---------+
| id | name1 | city |
+------+----------+---------+
| 1 | xiaoming | beijing |
+------+----------+---------+
1 row in set (0.00 sec)
mysql>
实现全备份:
备份test库:mysqldump -uroot -p test --flush-logs --master-data=2 --single-transaction > test_back.sql
再次插入:
mysql> insert into kehu(id,name1,city)values(1,'dapeng','shanghai');
Query OK, 1 row affected (0.04 sec)
mysql>
实现增量备份:
mysqladmin flush-logs
----------------------------------------------------------------------------------------
-rw-rw---- 1 mysql mysql 368 Apr 24 10:55 mysql-bin.000004
-rw-rw---- 1 mysql mysql 107 Apr 24 10:55 mysql-bin.000005
----------------------------------------------------------------------------------------
备份mysql-bin.000004文件
测试:
mysql> drop database test;
Query OK, 1 row affected (0.02 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)
mysql>
恢复时间点的全备份:
mysql> create database test;
Query OK, 1 row affected (0.00 sec)
mysql> use test;
Database changed
mysql> source /backup/test_back.sql;
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
....................................
mysql>
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| kehu |
+----------------+
1 row in set (0.00 sec)
mysql> select * from kehu;
+------+----------+---------+
| id | name1 | city |
+------+----------+---------+
| 1 | xiaoming | beijing |
+------+----------+---------+
1 row in set (0.00 sec)
mysql>
执行需要的增量备份:
mysqlbinlog mysql-bin.000004 | mysql
再次查看表的情况:
mysql> select * from kehu;
+------+----------+----------+
| id | name1 | city |
+------+----------+----------+
| 1 | xiaoming | beijing |
| 1 | dapeng | shanghai |
+------+----------+----------+
2 rows in set (0.00 sec)
mysql>
已经恢复到了最新的配置了。
转载请注明:谷谷点程序 » mysqldump实现全备份和增量备份