http://cwtea.blog.51cto.com/4500217/1259509/


ysql 备份与恢复

--煮酒品茶

用官方的文档讲解


mysqldump

备份文件(MYISAM)

INNODB?

数据库备份(完全备份和增量备份)

mysqldump --tab=/path/to/some/dir --opt db_name

--tab

mysqldump创建一个包含创建表的CREATE TABLE语句的tbl_name.sql文件,和一个包含其数据的tbl_name.txt文件。选项值为写入文件的目录。

默认情况,.txt数据文件的格式是在列值和每行后面的新行之间使用tab字符。可以使用--fields-xxx和--行--xxx选项明显指定格式。

1

2

[root@Mysql1-200 mysql]# mysqldump -uroot -p --tab=/backup/mysql/ --opt test

Enter password:


1

2

3

4

CREATE TABLE `10wbackup` (

  `id` int(11) NOT NULL,

  `number` int(11) NOT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;


过程:

1、导出一个创建table语名气的文件

2、导出一个含有数值的txt文件,以tab分开


1

2

3

4

5

6

7

8

[root@Mysql1-200 mysql]# mysqldump -u root -p test >/backup/mysql/test/test.sqlEnter password:

[root@Mysql1-200 mysql]# ll test

total 2520

-rw-r--r--. 1 root root 2580275 Jul 26 22:47 test.sql

[root@Mysql1-200 mysql]# ll test.sql/

total 1068

-rw-r--r--. 1 mysql mysql    1314 Jul 26 22:36 10w.sql

-rw-rw-rw-. 1 mysql mysql 1088917 Jul 26 22:36 10w.txt


自动备份脚本的流程:

1、获取一系列的信息

2、以单前时间备份在目录中建立的以当前时间为目录的结构


1

mysqlhotcopy db_name /path/to/some/dir


增量备份:

A    >      Z

A--B(完备)--C(增量备份)--D(增量备份)  > Z


mysql-bin.000001 (时间段) 0:00

mysql-bin.000002 (时间段) 0:00

mysql-bin.000003 (时间段) 0:00 ~ 6:00

6:00 --flush-logs

mysql-bin.000004 (时间段) 6:00 ~ 0:00

mysql-bin.000005 (时间段)



ySQL支持增量备份:需要用--log-bin选项来启动服务器以便启用二进制日志;参见5.11.3节,“二进制日志”。当想要进行增量备份时(包含上一次完全备份或增量备份之后的所有更改),应使用FLUSH LOGS回滚二进制日志。然后,你需要将从最后的完全或增量备份的某个时刻到最后某个点的所有二进制日志复制到备份位置。这些二进制日志为增量备份;恢复时,按照下面的解释应用。下次进行完全备份时,还应使用FLUSH LOGS或mysqlhotcopy --flushlogs回滚二进制日志。参见8.8节,“mysqldump:数据库备份程序”和8.9节,“mysqlhotcopy:数据库备份程序”。

如果MySQL服务器为从复制服务器,则无论选择什么备份方法,当备份从机数据时,还应备份master.info和relay-log.info文件。恢复了从机数据后,需要这些文件来继续复制。如果从机执行复制LOAD DATA INFILE命令,你应还备份用--slave-load-tmpdir选项指定的目录中的SQL_LOAD-*文件。(如果未指定,该位置默认为tmpdir变量值)。从机需要这些文件来继续复制中断的LOAD DATA INFILE操作。

如果必须恢复MyISAM表,先使用REPAIR TABLE或myisamchk -r来恢复。99.9%的情况下该方法可以工作。


1.    恢复原mysqldump备份,或二进制备份。

2.    执行下面的命令重新更新二进制日志:

3.    shell> mysqlbinlog hostname-bin.[0-9]* | mysql


1

2

mysqldump --single-transaction --all-databases --flush-logs > backup_sunday_1_PM.sql

--flush-logs

告诉服务器关闭当前的二进制日志文件并创建一个新文件。


1

mysqldump --single-transaction --flush-logs --master-data=2  --all-databases > backup_sunday_1_PM.sql


mysqldump --delete-master-logs

MySQL二进制日志占据硬盘空间。要想释放空间,应随时清空。操作方法是删掉不再使用的二进制日志,例如进行完全备份时:


恢复:

导入完备:

1

mysql < backup_sunday_1_PM.sql

1

mysql -u root -p  edittest < ./test.sql


现在这个点(周一)进行完全备份,下次完备(下周一) mysql-bin.000007

......(data)

mysql-bin.000007

周二进行增量备份

mysql-bin.000008

....(add table) table name:zhou2

周三进行增量备份

.... (add table) table name:zhou3s


1、完备

1

mysqldump -uroot -p --single-transaction --all-databases  --flush-logs >Wb/Wb-2013-7-26.sql

mysql-bin.000009 ~ mysql-bin.000010

有新数据

2、直接回GUNbin-log日志

周二

1

mysqladmin -uroot -pzuoloveyou flush-logs

mysql-bin.000010 ~ mysql-bin.000011

周三

1

mysqladmin -uroot -pzuoloveyou flush-logs

mysql-bin.000011 ~ mysql-bin.000012

2、备份bin-log日志

1

shell> mysqlbinlog gbichot2-bin.000007 gbichot2-bin.000008 | mysql


恢复过程:

1、恢复完备(OK)

1

mysql -uroot -p <../Wb/Wb-2013-7-26.sql

#星期一的完备状态

2、恢复周二的增量备份

2.1、进入binlog目录

cd /data/mysql

2.2、执行以下命令(bin-log是时间段,一次执行多个)

*数据不一致,那么我们必须严格按照binlog顺序来进行恢复。

*假定周二删除A用户,周三有新用户申请A名称。

1

mysqlbinlog mysql-bin.000010 mysql-bin.000011 | mysql -uroot -p

#星期二的状态(zhou2的库没有zhou3的库)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

mysql> show databases;

+--------------------+

Database           |

+--------------------+

| information_schema |

| MyISam             |

| edittest           |

| good1              |

| mysql              |

| performance_schema |

| test               |

| zhou2              |

| zhou3              |

+--------------------+

9 rows in set (0.00 sec)

3、恢复周三的增量备份


备份目录:

增量备份目录:Zl-test-date

完全备份目录:Wb-test-date


TEST:

周三:(周三开始的)

mysql-bin.000012

周四:(周四开始的)

mysql-bin.000013

周五:(删除周四的,新建周五的)

mysql-bin.000014

mysql-bin.000015


备份机制:

周一完备,周二到周四增量备份

周一:完备后回GUN日志,同时备份的时候锁表和把表的内存刷入磁盘

周二到周日执行回GUN日志,并备份bin-log日志


结论:

增量备份是完全基于bin-log日志来进行的。

全备脚本:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

#/bin/bash

#Cwtea

#定义

Mysql="/usr/local/mysql5.5.32/bin/mysql"

MysqlDump="/usr/local/mysql5.5.32/bin/mysqldump"

User="root"

PassWord="*******"

DataBaseName="test"

WbBackup="/backup/mysql/Wb"

Now=`date +%Y-%m-%d`

#command

mkdir $Backup/$DataBaseName$Now

#mysqldump -uroot -p --single-transaction --all-databases  --flush-logs >Wb/Wb-2013-7-26.sql

$Mysql -u$User -p$PassWord -e "FLUSH TABLES;"

$MysqlDump -u$User -p$PassWord --single-transaction --all-databases  --flush-logs >$WbBackup/Wb-$Now.sql


增量备份脚本:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

#/bin/bash

#Cwtea

#定义

MysqlAdmin="/usr/local/mysql5.5.32/bin/mysqladmin"

MysqlDump="/usr/local/mysql5.5.32/bin/mysqldump"

ZlBackup="/backup/mysql"

DataBaseName="test"

User="root"

PassWord="*******"

Now=`date +%Y-%m-%d`

#command

#mysqladmin -uroot -p**** flush-logs

$MysqlAdmin -u$User -p$PassWord flush-logs

#Update bin-log

...........