现在的位置: 首页 > 综合 > 正文

mysqldump备份

2018年01月24日 ⁄ 综合 ⁄ 共 2956字 ⁄ 字号 评论关闭

一、mysqldump命令:

mysqldump由于是mysql自带的备份工具,属于逻辑备份,类似于oracle的exp和expdb(只能恢复到备份时的那一点),它配合二进制日志,可以做到基于时间点的恢复。

:该命令需要再shell下执行;

1、 常用命令:

备份所有数据库 --all-databases

# mysqldump -uroot -proot --all-databases >/tmp/dumpback/alldb.sql

 

备份某些数据库 --databases

# mysqldump -uroot -proot --databases db1 db2 > /tmp/dumpback/a.sql

 

备份某数据库中的表

# mysqldump -uroot -proot db1 tb1 > /tmp/dumpback/tb1.sql

 

只备份表结构  --no-data

# mysqldump -uroot -proot --no-data db1 tb1 > /tmp/dumpback/ tb11.sql

 

恢复(dropdatabase db1; drop database db2;)

Mysql>source /tmpa.sql

 

2、  备份的时候保持数据的一致性:

第一、同一时刻取出所有数据

对于事务支持的存储引擎,如Innodb 或者BDB 等,可以通过控制将整个备份过程在同一个事务中,使用“--single-transaction”选项。

例如:

# mysqldump --single-transaction test > test_backup.sql

 

第二、数据库中的数据处于静止状态——通过锁表参数

--lock-all-tables 一次锁定所有的表,适用于dump的表分别处于各个不同的数据库中的情况.

:--lock-tables 是在每次备份表前锁定该表,此参数是默认为true

 

3、  其他:

1)--lock-tables:加了一个 READLOCAL LOCK,该锁不会阻止读,也不会阻止新的数据插入。(即:只有在备份表时才会锁定)

2)--lock-all-tables:它请求发起一个全局的读锁,会阻止对所有表的写入操作,以此来确保数据的一致性。备份完成后,该会话断开,会自动解锁。

3)--single-transaction

InnoDB表在备份时,通常启用选项 --single-transaction 来保证备份的一致性,实际上它的工作原理是设定本次会话的隔离级别为:REPEATABLEREAD,以确保本次会话(dump)时,不会看到其他会话已经提交了的数据。

 

4、 mysqldump+binlog增量备份:

从mysqldump备份文件恢复数据会丢失掉从备份点开始的更新数据,所以还需要结合mysqlbinlog二进制日志增量备份。确保my.ini或者my.cnf中包含下面的配置以启用二进制日志,或者mysqld ---log-bin:

[mysqld]

log-bin=mysql-bin

    mysqldump命令必须带上--flush-logs选项以生成新的二进制日志文件

mysqldump --single-transaction --flush-logs--master-data=2 > backup.sql

    这样生成的增量二进制日志文件比如为mysql-bin.000003,那么恢复数据时如下:

1

2

shell> mysql -uroot -pPwd < backup_sunday_1_PM.sql

shell> mysqlbinlog mysql-bin.000003 | mysql -uroot -pPwd

   此外mysqlbinlog还可以指定--start-date、--stop-date、--start-position和--stop-position参数,用于精确恢复数据到某个时刻之前或者跳过中间某个出问题时间段恢复数据,直接摘录MySQL文档说明中相关内容如下:

1)指定恢复时间

对于MySQL4.1.4,可以在mysqlbinlog语句中通过--start-date和--stop-date选项指定DATETIME格式的起止时间。举例说明,假设在今天上午10:00(今天是2005年4月20日),执行SQL语句来删除一个大表。要想恢复表和数据,你可以恢复前晚上的备份,并输入:

mysqlbinlog--stop-date="2005-04-20 9:59:59" /var/log/mysql/bin.123456 \

     | mysql -u root -pmypwd

该命令将恢复截止到在--stop-date选项中以DATETIME格式给出的日期和时间的所有数据。如果你没有检测到几个小时后输入的错误的SQL语句,可能你想要恢复后面发生的活动。根据这些,你可以用起使日期和时间再次运行mysqlbinlog:

 

mysqlbinlog--start-date="2005-04-20 10:01:00" /var/log/mysql/bin.123456 \

     | mysql -u root -pmypwd \

在该行中,从上午10:01登录的SQL语句将运行。组合执行前夜的转储文件和mysqlbinlog的两行可以将所有数据恢复到上午10:00前一秒钟。你应检查日志以确保时间确切。下一节介绍如何实现。

 

2)指定恢复位置

也可以不指定日期和时间,而使用mysqlbinlog的选项--start-position和--stop-position来指定日志位置。它们的作用与起止日选项相同,不同的是给出了从日志起的位置号。使用日志位置是更准确的恢复方法,特别是当由于破坏性SQL语句同时发生许多事务的时候。要想确定位置号,可以运行mysqlbinlog寻找执行了不期望的事务的时间范围,但应将结果重新指向文本文件以便进行检查。操作方法为:

mysqlbinlog--start-date="2005-04-20 9:55:00" --stop-date="2005-04-2010:05:00" \

      /var/log/mysql/bin.123456 >/tmp/mysql_restore.sql

该命令将在/tmp目录创建小的文本文件,将显示执行了错误的SQL语句时的SQL语句。你可以用文本编辑器打开该文件,寻找你不要想重复的语句。如果二进制日志中的位置号用于停止和继续恢复操作,应进行注释。用log_pos加一个数字来标记位置。使用位置号恢复了以前的备份文件后,你应从命令行输入下面内容:

 

mysqlbinlog--stop-position="368312" /var/log/mysql/bin.123456 \

    | mysql -u root -pmypwd

 

mysqlbinlog--start-position="368315" /var/log/mysql/bin.123456 \

    | mysql -u root -pmypwd \

上面的第1行将恢复到停止位置为止的所有事务。下一行将恢复从给定的起始位置直到二进制日志结束的所有事务。因为mysqlbinlog的输出包括每个SQL语句记录之前的SET TIMESTAMP语句,恢复的数据和相关MySQL日志将反应事务执行的原时间。

 

 

抱歉!评论已关闭.