Linux运维学习笔记之二十:MySQL备份和恢复基础

8 篇文章 1 订阅

第三十一章 MySQL备份和恢复基础

一、备份的意义

运维就是作两件事:一个是保护公司的数据,另一个是网站7*24小时提供服务。那么,哪个更重要?要具体看业务和公司。

银行等金融业:数据最重要,一条都不能丢,但宕机、停机的影响没那么大

百度搜索、QQ聊天记录丢几万条,也没什么。

对数据来讲,数据最核心的数据是数据库中的数据,当然也包括其它数据。

对于绝大多数企业来讲,失去数据就失去商机、失去产品、失去客户、公司倒闭。。。,因此,数据库的备份和恢复就显得十分重要了。

二、备份单个数据库(多种参数使用)
1、备份命令:mysqldump
(1)命令说明:

MySQL数据库自带的一个很好用的备份命令。是逻辑备份,导出 的是SQL语句。也就是把数据从MySQL库中以逻辑的SQL语句的形式直接输出或生成备份的文件的过程。

(2)语法(Syntax)

mysqldump -u <username> -p <数据库名>  > 备份路径文件名

(3)多实例的备份语法(Syntax)

mysqldump -u <username> -p <数据库名>  -S <sockPath> >备份路径文件名

(4)常用参数

-A --all-databases:导出全部数据库

-Y --all-tablespaces:导出全部表空间

-y --no-tablespaces:不导出任何表空间信息

--add-drop-database每个数据库创建之前添加drop数据库语句。

--add-drop-table每个数据表创建之前添加drop数据表语句。(默认为打开状态,使用--skip-add-drop-table取消选项)

--add-locks在每个表导出之前增加LOCK TABLES并且之后UNLOCKTABLE。(默认为打开状态,使用--skip-add-locks取消选项)

--comments附加注释信息。默认为打开,可以用--skip-comments取消

--compact导出更少的输出信息(用于调试)。去掉注释和头尾等结构。可以使用选项:--skip-add-drop-table--skip-add-locks --skip-comments --skip-disable-keys

-c --complete-insert:使用完整的insert语句(包含列名称)。这么做能提高插入效率,但是可能会受到max_allowed_packet参数的影响而导致插入失败。

-C --compress:在客户端和服务器之间启用压缩传递所有信息

-B--databases:导出几个数据库。参数后面所有名字参量都被看作数据库名。

--debug输出debug信息,用于调试。默认值为:d:t:o,/tmp/

--debug-info输出调试信息并退出

--default-character-set设置默认字符集,默认值为utf8

--delayed-insert采用延时插入方式(INSERT DELAYED)导出数据

-E--events:导出事件。

--master-data:在备份文件中写入备份时的binlog文件,在恢复进,增量数据从这个文件之后的日志开始恢复。值为1时,binlog文件名和位置没有注释,为2时,则在备份文件中将binlog的文件名和位置进行注释

--flush-logs开始导出之前刷新日志。请注意:假如一次导出多个数据库(使用选项--databases或者--all-databases),将会逐个数据库刷新日志。除使用--lock-all-tables或者--master-data外。在这种情况下,日志将会被刷新一次,相应的所以表同时被锁定。因此,如果打算同时导出和刷新日志应该使用--lock-all-tables 或者--master-data和--flush-logs。

--flush-privileges在导出mysql数据库之后,发出一条FLUSH PRIVILEGES 语句。为了正确恢复,该选项应该用于导出mysql数据库和依赖mysql数据库数据的任何时候。

--force在导出过程中忽略出现的SQL错误。

-h --host:需要导出的主机信息

--ignore-table不导出指定表。指定忽略多个表时,需要重复多次,每次一个表。每个表必须同时指定数据库和表名。例如:--ignore-table=database.table1 --ignore-table=database.table2 ……

-x --lock-all-tables:提交请求锁定所有数据库中的所有表,以保证数据的一致性。这是一个全局读锁,并且自动关闭--single-transaction 和--lock-tables选项。

-l --lock-tables:开始导出前,锁定所有表。用READ LOCAL锁定表以允许MyISAM表并行插入。对于支持事务的表例如InnoDB和BDB,--single-transaction是一个更好的选择,因为它根本不需要锁定表。请注意当导出多个数据库时,--lock-tables分别为每个数据库锁定表。因此,该选项不能保证导出文件中的表在数据库之间的逻辑一致性。不同数据库表的导出状态可以完全不同。

--single-transaction:适合innodb事务数据库的备份。保证备份的一致性,原理是设定本次会话的隔离级别为Repeatableread,来保证本次会话(也就是dump)时,不会看到其它会话已经提交了的数据。

-F:刷新binlog,如果binlog打开了,-F参数会在备份时自动刷新binlog进行切换。

-n --no-create-db:只导出数据,而不添加CREATE DATABASE 语句。

-t --no-create-info:只导出数据,而不添加CREATE TABLE 语句。

-d --no-data:不导出任何数据,只导出数据库表结构。

-p --password:连接数据库密码

-P --port:连接数据库端口号

-u --user:指定连接的用户名。

(5)方法示例

a、导出整个数据库(包括数据库中的数据)

mysqldump -u username -p dbname > dbname.sql

b、导出数据库结构(不含数据)

mysqldump -u username -p -d dbname > dbname.sql

c、导出数据库中的某张数据表(包含数据)

mysqldump -u username -p dbname tablename > tablename.sql

d、导出数据库中的某张数据表的表结构(不含数据)

mysqldump -u username -p -d dbname tablename > tablename.sql

2、恢复操作
(1)语法(Syntax)

mysql -u<username> -p<password> <dbname> < /mnt/mytest_bak.sql

说明:指定dbname,相当于use <dbname>

or

mysql> source /mnt/mytest_bak.sql

(2)示例(库必须要保留,空库都行)

mysql -uroot -p'123456' mytest < /mnt/mytest_bak.sql

3、示例1:无参数备份数据库mytest和恢复
(1)备份操作

a、备份

mysqldump -uroot -p‘123456’ mytest >/mnt/oldboy_bak20170411.sql

b、查看备份集

grep -Ev "#|\/|^$|--" /mnt/oldboy_bak20170411.sql

DROP TABLE IF EXISTS `student`;

CREATE TABLE `student` (

 `id` int(4) NOT NULL AUTO_INCREMENT,

 `name` char(20) NOT NULL,

 `age` tinyint(2) NOT NULL DEFAULT '0',

 `dept` varchar(16) DEFAULT NULL,

 PRIMARY KEY (`id`),

 KEY `index_name` (`name`)

) ENGINE=InnoDB AUTO_INCREMENT=7DEFAULT CHARSET=latin1;

LOCK TABLES `student` WRITE;

INSERT INTO `student` VALUES(1,'Tom',20,'S11'),(2,'Jary',21,'S12'),(3,'King',25,'S10'),(4,'Smith',19,'S11'),(5,'??',20,'S11'),(6,'?????‰',20,'S11');

UNLOCK TABLES;

c、乱码原因

导出的数据中存在乱码,是因为在导出时没有加字符集,但是在恢复到数据库的时候会正常,只是系统外查看不正常而已。另外,导出的语句中,insert是批量插入的方式,这样在恢复时效率要高一些。

d、解决导出乱码

(i)查看MySQL字符集

show variables like 'character_set%';

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

|Variable_name            | Value                                     |

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

|character_set_client     | utf8                                      |

|character_set_connection | utf8                                      |

| character_set_database   | utf8                                      |

|character_set_filesystem | binary                                    |

|character_set_results    | utf8                                      |

|character_set_server     | utf8                                      |

|character_set_system     | utf8                                      |

|character_sets_dir       |/application/mysql-5.5.32/share/charsets/ |

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

(ii)查看导出的SQL中数据库和表的字符集

ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;

(iii)修改配置文件中的字符集为latin1

vi /etc/my.cnf

[client]

#default-character-set=utf8

default-character-set=latin1

[mysqld]

#character-set-server=utf8

character-set-server=latin1

(iv)重启MySQL,并查看字符集

/etc/init.d/mysqld restart

mysql> show variables like 'character_set%';

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

|Variable_name            | Value                                     |

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

|character_set_client     | latin1                                    |

|character_set_connection | latin1                                    |

|character_set_database   | latin1                                    |

|character_set_filesystem | binary                                    |

|character_set_results    | latin1                                    |

|character_set_server     | latin1                                    |

|character_set_system     | utf8                                      |

|character_sets_dir       |/application/mysql-5.5.32/share/charsets/ |

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

(v)重新导出数据

mysqldump -u root -p'123456' mytest > /mnt/mytest_bak.sql

(vi)查看备份集

grep -Ev "#|\/|^$|--" /mnt/mytest_bak.sql                             

DROP TABLE IFEXISTS `student`;

CREATE TABLE`student` (

  `id` int(4) NOT NULL AUTO_INCREMENT,

  `name` char(20) NOT NULL,

  `age` tinyint(2) NOT NULL DEFAULT '0',

  `dept` varchar(16) DEFAULT NULL,

  PRIMARY KEY (`id`),

  KEY `index_name` (`name`)

) ENGINE=InnoDBAUTO_INCREMENT=7 DEFAULT CHARSET=latin1;

LOCK TABLES`student` WRITE;

INSERT INTO`student` VALUES (1,'Tom',20,'S11'),(2,'Jary',21,'S12'),(3,'King',25,'S10'),(4,'Smith',19,'S11'),(5,'??',20,'S11'),(6,'张三',20,'S11');

UNLOCK TABLES;

(vii)也可能在导出时指定字符集导出

mysqldump -u root -p'123456' --default-character-set=latin1mytest > /mnt/oldboy_bak20170411_2.sql

如果在客户端查看备份文件还是乱码,则需调整客户端连接工具的字符集。实际上并不影响导入后的效果。

(2)恢复操作

a、删除student表(库必须要保留,空库都行)

mysql -uroot -p'123456' -e "use mytest;drop tablestudent;"

b、恢复数据

mysql -uroot -p'123456' mytest < /mnt/mytest_bak.sql

c、查看数据

mysql -uroot -p'123456' -e "select * from mytest.student;"

4、示例2:-B参数备份和恢复(建议使用)
(1)备份操作

a、备份

mysqldump -uroot -p'123456' -B mytest > /mnt/mytest_bak_B.sql

b、比较备份集mytest_bak.sql和mytest_bak_B.sql的差异

diff mnt/mytest_bak.sql mnt/mytest_bak_B.sql

...

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mytest` /*!40100 ......;

USE `mytest`;

...

c、主要差别:

加了-B参数后,备份文件中多的Create database和usemytest的命令

d、加-B参数的好处

加上-B参数后,导出的数据文件中已存在创建库和使用库的语句,不需要手动在原库是创建库的操作,在恢复过程中不需要手动建库,可以直接还原恢复。

(2)恢复操作

a、删除mytest库

mysql -uroot -p'123456' -e "drop database mytest;"

b、恢复数据

(i)使用不带参数的导出文件导入(导入时不指定要恢复的数据库),报错

mysql -uroot - p'123456' < /mnt/mytest_bak.sql  

ERROR 1046(3D000) at line 22: No database selected

(ii)使用带-B参数的导出文件导入(导入时也不指定要恢复的数据库),成功

mysql -uroot -p'123456' < /mnt/mytest_bak_B.sql

c、查看数据

mysql -uroot -p'123456' -e "select * from mytest.student;"

5、示例3:--compact参数优化备份文小大小,减少输出注释(一般用于Debug调试)

(1)备份

mysqldump -uroot -p'123456' --compact -B mytest >/mnt/mytest_bak_Compact.sql

(2)查看备份文件内容

cat /mnt/mytest_bak_Compact.sql

CREATE DATABASE/*!32312 IF NOT EXISTS*/ `mytest` /*!40100 DEFAULT CHARACTER SET latin1 */;

 

USE `mytest`;

/*!40101 SET@saved_cs_client     =@@character_set_client */;

/*!40101 SETcharacter_set_client = utf8 */;

CREATE TABLE`student` (

  `id` int(4) NOT NULL AUTO_INCREMENT,

  `name` char(20) NOT NULL,

  `age` tinyint(2) NOT NULL DEFAULT '0',

  `dept` varchar(16) DEFAULT NULL,

  PRIMARY KEY (`id`),

  KEY `index_name` (`name`)

) ENGINE=InnoDBAUTO_INCREMENT=7 DEFAULT CHARSET=latin1;

/*!40101 SETcharacter_set_client = @saved_cs_client */;

INSERT INTO `student` VALUES(1,'Tom',20,'S11'),(2,'Jary',21,'S12'),(3,'King',25,'S10'),(4,'Smith',19,'S11'),(5,'??',20,'S11'),(6,'张三',20,'S11');

(3)说明

使用--compact参数,可以优化输出内容的大小,让容量更少,适合调试。便会忽略--skip-add-drop-table,--no-set-names,--skip-disable-keys,--skip-add-locks等几个参数的功能。

6、示例4:指定压缩命令来压缩备份文件

(1)备份

mysqldump -uroot -p'123456' -B mytest | gzip > /mnt/mytest_bak_.sql.gz

(2)说明

mysqldump导出的文件是文本文件,压缩效率很高

7、示例5:备份多个数据库

(1)说明

通过-B参数指定相关数据库,每个数据库名之前用空格分格。当使用-B参数后,将所有数据库全部列全,则此时等同于-A参数。

(2)备份

mysqldump -uroot -p'123456' -B mytest wiki | gzip >/mnt/mytestAndWiki_bak.sql.gz

8、示例6:分库备份

(1)说明

分库备份实际上就是执行一个备份语句就备份一个库,有多个库时,就执行多条相同的备份语句,只是备份的库名和备份文件名不同而已。可能通过shell脚本自动生成并执行相应的操作,也可以把所有单个备份语句写在一个shell脚本中,通过cron定时任务来备份。

分库备份的意义是在所有库都备份成一个备份文件时,恢复其中一个库的数据是比较麻烦的,所以分库备份,利于恢复。

(2)备份

a、方法一:笨办法

vi /data/backup/mysqlbackup.sh

mysqldump -uroot-p'123456' -B dbname1 > /backup/bak_dbname1.sql

mysqldump -uroot-p'123456' -B dbname2 > /backup/bak_dbname2.sql

crontab -e

00 00 * * *  /bash/sh /data/backup/mysqlbackup.sh

b、方法二:sed拼接

mysql -uroot -p'123456' --events -e "show databases;" |grep -Evi "database|infor|perfor" | sed -r 's#^([a-z].*$)#mysqldump-uroot -p"123456" -B \1 | gzip > /mnt/\1.sql.gz#g'|bash

c、方法三:for循环

vi fenku.sh

for dbname in ` mysql -uroot -p'123456' -e "showdatabases;" | grep -Evi "database|infor|perfor"`

do

    mysqldump -uroot -p"123456"--events -B $dbname | gzip > /mnt/${dbname}_bak.sql.gz

done

说明:${dbname}_bak,由于要求备份文件名以$dbname_bak.sql.gz格式命令,但系统无法辨别变量是$dbname还是$dbname_bak,所以此时就需要用大括号“{}”将变量括起来,就是${dbname}_bak.sql.gz了。

9、示例7:-d参数,只备份数据库中表结构

mysqldump -uroot -p'123456' -d mytest > /mnt/mytestDesc_bak.sql

10、示例8:-A参数备份全库,并且-F刷新和切换binlog

mysqldump -uroot -p'123456' -A -B -F > /mnt/All_bak.sql

11、示例9:--master-data参数在备份文件中写入当前binlog文件号

mysqldump -uroot -p'123456' --master-data=1 --compact mytest > /mnt/All_bak.sql

 

mysqldump -uroot -p'123456' --master-data=2 --compact mytest > /mnt/All_bak.sql

 

三、备份单个表
1、语法(Syntax):不能加-B参数

mysqldump -u<username> -p<password> dbname tablename1tablename2... > 备份文件名

2、示例1:备份mytest库中的student表

mysqldump -uroot -p'123456' mytest student >/mnt/table_bak/student_bak.sql

3、示例2:备份mytest库中所有表,就是备份mytest库

mysqldump -uroot -p'123456' mytest > /mnt/table_bak/all_bak.sql

4、示例3:备份mytest库中的student和test表

mysqldump -uroot -p'123456' mytest student test >/mnt/table_bak/two_bak.sql

5、示例4:MySQL数据库分库分表备份
(1)原理

通过for循环,先获取所有数据库名,再通过for循环数据库名获取数据库下的表名,最后生成备份语句进行备份。详细见参考博文注22、MySQL数据库分库分表备份http://edu.51cto.com/course/course_id-808.html

(2)缺点:文件多,很碎
6、示例5:-d参数,只备份表结构

mysqldump -uroot -p'123456' -d mytest stusent > /mnt/studentDesc_bak.sql

7、示例6:-t参数,只备份数据

mysqldump -uroot -p'123456' --compact -t mytest stusent > /mnt/studentData_bak.sql

INSERT INTO `student` VALUES(1,'Tom',20,'S11'),(2,'Jary',21,'S12'),(3,'King',25,'S10'),(4,'Smith',19,'S11'),(5,'??',20,'S11'),(6,'张三',20,'S11');

 

 

 

 

四、企业生产场景不同引擎备份命令参数
1、mysqldump的关键参数

-B:指定多个库,在备份文件中增加建库语句和use语句

--compact:去掉备份文件中的注释,适合调试,生产场景不用

-A:备份所有库

-F:刷新binlog日志

--master-data:在备份文件中增加binlog日志文件名及对应的位置点

-x  --lock-all-tables:锁表

-l:只读锁表

-d:只备份表结构

-t:只备份数据

--single-transaction:适合innodb事务数据库的备份

   InnoDB表在备份时,通常启用选项--single-transaction来保证备份的一致性,原理是设定本次会话的隔离级别为Repeatable read,来保证本次会话(也就是dump)时,不会看到其它会话已经提交了的数据。

2、不同引擎备份命令参数用法
(1)Myisam引擎:

mysqldump -uroot -p123456 -A -B --master-data=1 -x| gzip > /data/all_$(date+%F).sql.gz

(2)InnoDB引擎:

mysqldump -uroot -p123456 -A -B  --master-data=1 --single-transaction >/data/bak.sql

(3)生产环境DBA给出的命令

a、for MyISAM

mysqldump --user=root --all-databases --flush-privileges --lock-all-tables\

--master-data=1 --flush-logs --triggers --routines --events \

--hex-blob > $BACKUP_DIR/full_dump_$BACKUP_TIMESTAMP.sql

b、for InnoDB

mysqldump --user=root --all-databases --flush-privileges --single-transaction\

--master-data=1 --flush-logs --triggers --routines --events \

--hex-blob > $BACKUP_DIR/full_dump_$BACKUP_TIMESTAMP.sql

五、MySQL全量恢复
1、mysql命令恢复
(1)语法(Syntax)

mysql -u<username> -p<password> <dbname> < 备份文件.sql

说明:指定dbname,相当于use <dbname>

(2)示例(库必须要保留,空库都行)

mysql -uroot -p'123456' mytest < /mnt/mytest_bak.sql

2、source命令恢复
(1)语法(Syntax)

mysql> use <dbname>;

mysql> source 备份文件.sql;  #默认路径是登陆mysql前的路径

(2)示例

mysql> use mytest;

mysql> source /mnt/mytest_bak.sql

3、分库备份恢复
(1)原理

通过for循环将备份文件一个一个进行恢复

(2)示例

a、查看备份文件

ls /backup

mysql_bak.sql   wiki_bak.sql    mytest_bak.sql

b、语句

for dbname in `ls /backup/`;do mysql -uroot -p'123456' </backup/$dbname;done

六、MySQL的活动日志:binlog
1、什么是binlog

binlog是MySQL的二进制日志,似于Oracle的归档日志,用于记录所有更新了数据或者已经潜在更新了数据的所有语句。语句以事件的形式保存,它描述数据更改,并以二进制的形式保存在磁盘中。

2、binlog作用

记录MySQL数据库的变更历史(具体的时间点所有的SQL操作),用来数据库增量备份和恢复(增量备份和基于时间点的恢复)、Mysql的复制(主主数据库的复制、主从数据库的复制)的二进制日志的信息。

3、文件位置和命名方式:
(1)默认存放位置

为数据库文件所在目录下。如/application/mysql/data

(2)文件的命名方式:

名称为配置文件/etc/my.cn中指定的前缀+“。xxxxx”。如my.cnf中配置为log-bin=mysql-bin,则文件名为mysql-bin.xxxxx

(3)重启mysql一次将会自动生成一个新的binlog
(4)查看binlog

ll /application/mysql/data/*-bin*  

-rw-rw---- 1 mysql mysql  866Apr  9 13:01/application/mysql/data/mysql-bin.000001

-rw-rw---- 1 mysql mysql 1609 Apr 9 18:39 /application/mysql/data/mysql-bin.000002

-rw-rw---- 1 mysql mysql  125Apr 11 00:25 /application/mysql/data/mysql-bin.000003

-rw-rw---- 1 mysql mysql  106Apr 15 11:54 /application/mysql/data/mysql-bin.000004

4、配置文件中和binlog有关参数
(1)log_bin

设置此参数表示启用binlog功能,并指定路径名称

(2)log_bin_index

设置此参数是指定二进制索引文件的路径与名称

(3)binlog_do_db

此参数表示只记录指定数据库的二进制日志

(4)binlog_ignore_db

此参数表示不记录指定的数据库的二进制日志

(5)max_binlog_cache_size

此参数表示binlog使用的内存最大的尺寸

(6)binlog_cache_size

此参数表示binlog使用的内存大小,可以通过状态变量binlog_cache_use和binlog_cache_disk_use来帮助测试。

(7)binlog_cache_use

使用二进制日志缓存的事务数量

(8)binlog_cache_disk_use

使用二进制日志缓存但超过binlog_cache_size值并使用临时文件来保存事务中的语句的事务数量

(9)max_binlog_size

Binlog最大值,最大和默认值是1GB,该设置并不能严格控制Binlog的大小,尤其是Binlog比较靠近最大值而又遇到一个比较大事务时,为了保证事务的完整性,不可能做切换日志的动作,只能将该事务的所有SQL都记录进当前日志,直到事务结束

(10)sync_binlog

这个参数直接影响mysql的性能和完整性

a、sync_binlog=0

当事务提交后,Mysql仅仅是将binlog_cache中的数据写入Binlog文件,但不执行fsync之类的磁盘同步指令通知文件系统将缓存刷新到磁盘,而让Filesystem自行决定什么时候来做同步,这个是性能最好的。

b、sync_binlog=n

在进行n次事务提交以后,Mysql将执行一次fsync之类的磁盘同步指令,同志文件系统将Binlog文件缓存刷新到磁盘。

Mysql中默认的设置是sync_binlog=0,即不作任何强制性的磁盘刷新指令,这时性能是最好的,但风险也是最大的。一旦系统绷Crash,在文件系统缓存中的所有Binlog信息都会丢失

5、打开binlog开关,开启MySQL活动日志记录
(1)修改配置文件/etc/my.cnf,在mysqld的下面

vi /etc/my.cnf

修改前:

#log-bin=mysql-bin

修改后:

log-bin=mysql-bin

(2)重启MySQL,让配置生效

/etc/init.d/mysqld restart

6、查看binlog
(1)查看命令mysqlbinlog

通过mysqlbinlog命令可以查看binlog的内容

(2)语法(Syntax)

mysqlbinlog binlog文件名

(3)示例

mysqlbinlog  /application/mysql/data/binlog.000005

*!40019 SET @@session.max_insert_delayed_threads=0*/;

/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;

DELIMITER /*!*/;

# at 4

#170415 15:47:00 server id 1 end_log_pos 106   Start: binlog v4, server v 5.1.72-log created 170415 15:47:00 at startup

# Warning: this binlog is either in use or was not closed properly.

ROLLBACK/*!*/;

BINLOG '

9M/xWA8BAAAAZgAAAGoAAAABAAQANS4xLjcyLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAD0z/FYEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC

'/*!*/;

# at 106

#170415 15:54:34 server id 1 end_log_pos 197   Query   thread_id=1     exec_time=0     error_code=0

use `mytest`/*!*/;

SET TIMESTAMP=1492242874/*!*/;

SET @@session.pseudo_thread_id=1/*!*/;

SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1,@@session.unique_checks=1, @@session.autocommit=1/*!*/;

SET @@session.sql_mode=0/*!*/;

SET @@session.auto_increment_increment=1,@@session.auto_increment_offset=1/*!*/;

/*!\C latin1 *//*!*/;

SET@@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=8/*!*/;

SET @@session.lc_time_names=0/*!*/;

SET @@session.collation_database=DEFAULT/*!*/;

createtable test1(id int)

/*!*/;

# at 197

#170415 15:55:17 server id 1 end_log_pos 289   Query   thread_id=1     exec_time=0     error_code=0

SET TIMESTAMP=1492242917/*!*/;

insertinto test1 values(1)

/*!*/;

# at 289

#170415 15:55:20 server id 1 end_log_pos 381   Query   thread_id=1     exec_time=0     error_code=0

SET TIMESTAMP=1492242920/*!*/;

insertinto test1 values(2)

/*!*/;

# at 381

#170415 15:55:26 server id 1 end_log_pos 473   Query   thread_id=1     exec_time=0     error_code=0

SET TIMESTAMP=1492242926/*!*/;

insertinto test1 values(3)

/*!*/;

# at 473

#170415 15:55:35 server id 1 end_log_pos 565   Query   thread_id=1     exec_time=0     error_code=0

SET TIMESTAMP=1492242935/*!*/;

insertinto test1 values(4)

/*!*/;

# at 565

#170415 15:55:39 server id 1 end_log_pos 657   Query   thread_id=1     exec_time=0     error_code=0

SET TIMESTAMP=1492242939/*!*/;

insertinto test1 values(5)

/*!*/;

# at 657

#170415 15:56:13 server id 1 end_log_pos 754   Query   thread_id=1     exec_time=0     error_code=0

SET TIMESTAMP=1492242973/*!*/;

updatetest1 set id=9 where id=2

/*!*/;

DELIMITER ;

# End of log file

ROLLBACK /* added by mysqlbinlog */;

/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

(4)解析binlog格式

a、截取示例

# at 657

#170415 15:56:13 server id 1 end_log_pos 754   Query   thread_id=1     exec_time=0     error_code=0

SET TIMESTAMP=1492242973/*!*/;

update test1 set id=9 where id=2

/*!*/;

b、位置:位于文件中的位置

“at 657”说明“事件”的起点,是以第657字节开始;

“end_log_pos 754”说明以第754字节结束

c、时间戳

事件发生的时间戳:“170415 15:56:13”

d、事件执行时间

事件执行花费的时间:" exec_time=0"

e、错误码

错误码为:“error_code=0”

f、服务器的标识

服务器的标识id:“server id 1”

7、mysqlbinlog参数

-d <dbname>:截取指定数据库的binlog

-r 重定向

8、binlog的删除

binlog的删除可以手工删除或自动删除

(1)自动删除binlog

通过binlog参数(expire_logs_days )来实现mysql自动删除binlog

mysql> show binary logs;

mysql> show variables like 'expire_logs_days';

mysql> set global expire_logs_days=3;

(2)手工删除binlog

mysql> reset master;   //删除master的binlog

mysql> reset slave;    //删除slave的中继日志

mysql> purge master logs before '2012-03-30 17:20:00';  //删除指定日期以前的日志索引中binlog日志文件

mysql> purge master logs to 'binlog.000002';   //删除指定日志文件的日志索引中binlog日志文件

或者直接用操作系统命令直接删除

mysql> set sql_log_bin=1/0; //如果用户有super权限,可以启用或禁用当前会话的binlog记录

mysql> show master logs; //查看master的binlog日志

mysql> show binary logs; //查看master的binlog日志

mysql> show master status; //用于提供master二进制日志文件的状态信息

mysql> show slave hosts; //显示当前注册的slave的列表。不以--report-host=slave_name选项为开头的slave不会显示在本列表中

9、示例
(1)示例1:通过binlog只是生成数据库mytest的操作日志,以便增量恢复数据库mytest

mysqlbinlog -d mytest /application/mysql/data/binlog.000005 >mytest.sql

输出:将binlog中所有与mytest库相关的语句写入到mytest.sql文件中

(2)示例2:基于位置点恢复-指定开始和结束位置点(只到结束点,不包含结束点)

a、命令

mysqlbinlog mysql-bin.000005 --start-position=473--stop-position=657 -r pos.sql

b、输出内容

将binlog中起始位置为473,结束位置为657之前的所有binlog日志(不包含657的日志)写入到pos.sql文件中。

cat pos.sql

。。。

# at 473

。。。

insert intotest1 values(4)

/*!*/;

# at 565

。。。

insert intotest1 values(5)

/*!*/;

DELIMITER ;

# End of logfile

ROLLBACK /*added by mysqlbinlog */;

/*!50003 SETCOMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

c、注意事项

实际输出的为473565位置的日志,没有637

位置点必须是mysql-bin.000005中真实存在的。

如果不写结束点,则为从开始点到文件结尾的所有内容

(3)示例3:基于时间点恢复-指定开始和结束的时间点(不是特别精确,因为同一时间可能有多条语句)

a、命令

mysqlbinlog binlog.000005 --start-datetime='170415 15:47:00'--stop-datetime='170415 15:55:35' -r time.sql

b、注意事项

如果不写结束时间,则为从开始时间到文件结尾的所有内容。

由于同一时间有可能存在多条语句,所以通过时间点来恢复有时不是太精确。

时间点可以向前或向后微调一下,确保能覆盖需要的内容。

(4)示例4:小试牛刀初步增量恢复MySQL数据库

详见第三十章第七部分SQL操作的第8节Update的第3小节的小试牛刀初步增量恢复MySQL数据库。

10、一个备份错误案例:如果不份数据将导致数据不是想要的
(1)备份命令错误,但由于重定向,所以无错误显示,看起来命令执行很正常。

mysqldump -uroot -p123456 -A -B mytest > /data/mysql_bak2.sql

(2)错误说明:-A表示备份全库,-B表示备份指定的库,互相冲突
(3)查看备份文件内容

cat /data/mysql_bak2.sql

Usage: mysqldump [OPTIONS] database [tables]

OR     mysqldump [OPTIONS]--databases [OPTIONS] DB1 [DB2 DB3...]

OR     mysqldump [OPTIONS]--all-databases [OPTIONS]

For more options, use mysqldump --help

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值