MariaDB/MySQL备份恢复系列:
备份和恢复(一):mysqldump工具用法详述
备份和恢复(二):导入、导出表数据
备份和恢复(三):xtrabackup用法和原理详述


1.备份分类

按照是否能够继续提供服务,将数据库备份类型划分为:

  • 热备份:在线备份,能读能写
  • 温备份:能读不能写
  • 冷备份:离线备份

按照备份数据库对象分类:

  • 物理备份:直接复制数据文件
  • 逻辑备份:将数据导出至文件中,必要时将其还原(也包括备份成sql语句的方式)

按照是否备份整个数据集分为:

  • 完全备份:备份从开始到某段时间的全部数据
  • 差异备份:备份自完全备份以来变化的数据
  • 增量备份:备份自上次增量备份以来变化的数据

分类方式不同,不同分类的备份没有冲突的关系,它们可以任意组合。

2.备份内容和备份工具

需要备份的内容:文件、二进制日志、事务日志、配置文件、操作系统上和MySQL相关的配置(如sudo,定时任务)。

物理备份和逻辑备份的优缺点:

  • 物理备份:直接复制数据文件,速度较快。
  • 逻辑备份:将数据导出到文本文件中或其他格式的文件中。有MySQL服务进程参与,相比物理备份而言速度较慢;可能丢失浮点数精度;但可以使用文本工具二次处理;可以跨版本和跨数据库系统进行移植。

备份策略:要考虑安全,也要考虑还原时长

  • 完全备份+增量
  • 完全备份+差异

备份工具:

  • mysqldump:逻辑备份工具。要求mysql服务在线。MyISAM(温备),InnoDB(热备)
  • mysqlhotcopy:物理备份工具,温备份,实际上是冷备。加锁、flush table并进行cp或scp。即将废弃的工具
  • cp:冷备
  • lvm快照:几乎热备。注意点是:先flush table、lock table、创建快照、释放锁、复制数据。因为要先flush table和lock table,这对于MyISAM来说很简单很容易实现。但对于InnoDB来说,因为事务的原因,锁表后可能还有缓存中的数据在写入文件中,所以应该监控缓存中的数据是真的已经完全写入数据文件中,之后才能进行复制数据。
  • xtrabackup:开源。MyISAM(温备),InnoDB(热备),速度较快。

3.mysqldump用法详述

官方手册:https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html

mysqldump默认会从配置文件中的mysqldump段读取选项,配置文件读取的顺序为:

  1. /etc/my.cnf --> /etc/mysql/my.cnf --> /usr/local/mysql/etc/my.cnf --> ~/.my.cnf

3.1 语法选项

  1. mysqldump [OPTIONS] database [tables]
  2. mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
  3. mysqldump [OPTIONS] --all-databases [OPTIONS]

3.1.1 连接选项

  1. -u, --user=name 指定用户名
  2. -S, --socket=name 指定套接字路径
  3. -p, --password[=name] 指定密码
  4. -P, --port=# 指定端口
  5. -h, --host=name 指定主机名
  1. -r, --result-file=name
  2. 将导出结果保存到指定的文件中,在Linux中等同于覆盖重定向。在windows中因为回车符\r\n的原因,使用该选项比重定向更好

3.1.2 筛选选项

  1. --all-databases, -A
  2. 指定dump所有数据库。等价于使用--databases选定所有库
  3. --databases, -B
  4. 指定需要dump的库。该选项后的所有内容都被当成数据库名;在输出文件中的每个数据库前会加上建库语句和use语句
  5. --ignore-table=db_name.tbl_name
  6. 导出时忽略指定数据库中的指定表,同样可用于忽略视图,要忽略多个则多次写该选项
  7. -d, --no-data
  8. 不导出表数据,可以用在仅导出表结构的情况。
  9. --events, -E
  10. 导出事件调度器
  11. --routines, -R
  12. 导出存储过程和函数。但不会导出它们的属性值,若要导出它们的属性,可以导出mysql.proc表然后reload
  13. --triggers
  14. 导出触发器,默认已开启
  15. --tables
  16. 覆盖--databases选项,导出指定的表。但这样只能导出一个库中的表。格式为--tables database_name tab_list
  17. --where='where_condition', -w 'where_condition'
  18. 指定筛选条件并导出表中符合筛选的数据,如--where="user='jim'"

3.1.3 DDL选项

  1. --add-drop-database
  2. 在输出中的create database语句前加上drop database语句先删除数据库
  3. --add-drop-table
  4. 在输出的create table语句前加上drop table语句先删除表,默认是已开启的
  5. --add-drop-trigger
  6. 在输出中的create trigger语句前加上drop trigger语句先删除触发器
  7. -n, --no-create-db
  8. 指定了--databases或者--all-databases选项时默认会加上数据库创建语句,该选项抑制建库语句的输出
  9. -t, --no-create-info
  10. 不在输出中包含建表语句
  11. --replace
  12. 使用replace代替insert语句

3.1.4 字符集选项

  1. --default-character-set=charset_name
  2. 在导出数据的过程中,指定导出的字符集。很重要,客户端服务端字符集不同导出时可能乱码,默认使用utf8
  3. --set-charset
  4. 在导出结果中加上set names charset_name语句。默认启用。

3.1.5 复制选项

  1. --apply-slave-statements
  2. --delete-master-logs
  3. --dump-slave[=value]
  4. --include-master-host-port
  1. --master-data[=value]
  2. 该选项主要用来建立一个replication,当值为1时,导出文件中记录change master语句;
  3. 当值为2时,change master语句被写成注释语句,默认值为空。
  4. 该选项自动忽略--lock-tables,当没有使用--single-transaction时自动启用--lock-all-tables

3.1.6 格式化选项

  1. --compact
  2. 简化输出导出的内容,几乎所有注释都不会输出
  3. --complete-insert, -c
  4. insert语句中加上插入的列信息
  5. --create-options
  6. 在导出的建表语句中,加上所有的建表选项
  7. --tab=dir_name, -T dir_name
  8. 将每个表的结构定义和数据分别导出到指定目录下文件名同表名的.sqltxt文件中,其中.txt
    文件中的字段分隔符是制表符。要求mysqldump必须和MySQL Server在同一主机,且mysql
    户对指定的目录有写权限,并且连接数据库的用户必须有file权限。且指定要dump的表,不能和
    --databases或--all-databases一起使用。它的实质是执行select into outfile
  9. --fields-terminated-by=name
  10. 指定输出文件中的字段分隔符
  11. --fields-enclosed-by=name
  12. 指定输出文件中的字段值的包围符,如使用引号将字符串包围起来引用
  13. --fields-optionally-enclosed-by=name
  14. 指定输出文件中可选字段引用符
  15. --fields-escaped-by=name
  16. 指定输出文件中的转义符
  17. --lines-terminated-by=name
  18. 指定输出文件中的换行符
  19. -Q, --quote-names
  20. 引用表名和列名时使用的标识符,默认使用反引号"`" 

3.1.7 性能选项

  1. --delayed-insert
  2. 对于非事务表,在insert时支持delayed功能,但在MySQL5.6.6开始该选项已经废弃
  3. --disable-keys, -K
  4. insert语句前后加上禁用和启用索引语句,大量数据插入时该选项很适合。默认开启
  5. --insert-ignore
  6. 使用insert ignore语句替代insert语句
  7. --quick, -q
  8. 快速导出数据,该选项对于导出大表非常好用。默认导出数据时会一次性检索表中所有数据并加入
    到内存中,而该选项是每次检索一行并导出一行

3.1.8 加锁和事务相关选项

  1. --add-locks
  2. insert语句前后加上lock tablesunlock tables语句,默认已开启。
  3. --flush-logs, -F
  4. 在开始dump前先flush logs,如果同时使用了--all-databases则依次在每个数据库dumpflush
    如果同时使用了--lock-all-tables,--master-data或者--single-transaction,则仅flush
    一次,等价于使用flush tables with read lock锁定所有表,这样可以让dumpflush在完全精
    确的同一时刻执行。
  5. --flush-privileges
  6. dump完所有数据库后在数据文件的结尾加上flush privileges语句,在导出的数据涉及mysql库或
    者依赖于mysql库时都应该使用该选项
  7. --lock-all-tables, -x
  8. 为所有表加上一个持续到dump结束的全局读锁。该选项在dump阶段仅加一次锁,一锁锁永久且锁所有。
    该选项自动禁用--lock-tables和--single-transaction选项
  9. --lock-tables, -l
  10. dump每个数据库前依次对该数据库中所有表加read local锁(多次加锁,lock tables...read local),
    这样就允许对myisam表进行并发插入。对于innodb存储引擎,使用--single-transaction
    --lock-tables更好,因为它不完全锁定表。因为该选项是分别对数据库加锁的,所以只能保证每个数
    据库的一致性而不能保证所有数据库之间的一致性。该选项主要用于myisam表,如果既有myisam又有
    innodb,则只能使用--lock-tables,或者分开dump更好
  11. --single-transaction
  12. 该选项在dump前将设置事务隔离级别为repeatable read并发送一个start transaction语句给
    服务端。该选项对于导出事务表如innodb表很有用,因为它在发出start transaction后能保证导
    出的数据库的一致性时而不阻塞任何的程序。该选项只能保证innodb表的一致性,无法保证myisam
    的一致性。在使用该选项的时候,一定要保证没有任何其他连接在使用ALTER TABLE,CREATE TABLE,
    DROP TABLE,RENAME TABLE,TRUNCATE TABLE语句,因为一致性读无法隔离这些语句。
    --single-transaction选项和--lock-tables选项互斥,因为lock tables会隐式提交事务。
    要导出大的innodb表,该选项结合--quick选项更好
  13. --no-autocommit
  14. insert语句前后加上SET autocommit = 0,并在需要提交的地方加上COMMIT语句
  15. --order-by-primary
  16. 如果表中存在主键或者唯一索引,则排序后按序导出。对于myisam表迁移到innobd表时比较有用,但是
    这样会让事务变得很长很慢

3.2 mysqldump导出示例

3.2.1 简单备份示例

创建示例数据库和表。

  1. # 创建第一个数据库
  2. CREATE DATABASE backuptest;
  3. USE backuptest;
  4. # 创建innodb表
  5. CREATE TABLE `student` (
  6. `studentid` INT (11) NOT NULL,
  7. `sname` CHAR (30) NOT NULL,
  8. `gender` enum ('male', 'female') DEFAULT NULL,
  9. `birth` date DEFAULT NULL,
  10. PRIMARY KEY (`studentid`)
  11. ) ENGINE = INNODB DEFAULT CHARSET = latin1
  12.  
  13. INSERT INTO student
  14. VALUES
  15. (1,'malongshuai','male',curdate()),
  16. (2,'gaoxiaofang','female',date_add(curdate(), INTERVAL - 2 YEAR)),
  17. (3,'longshuai','male',date_add(curdate(), INTERVAL - 5 YEAR)),
  18. (4,'meishaonv','female',date_add(curdate(), INTERVAL - 3 YEAR)),
  19. (5,'tun\'er','female',date_add(curdate(), INTERVAL - 4 YEAR));
  20.  
  21. # 创建myisam表,并且字符集设置为UTF8
  22. CREATE TABLE teacher (
  23. tid INT NOT NULL PRIMARY KEY,
  24. tname VARCHAR (30),
  25. gender enum ('male', 'female'),
  26. classname CHAR (10)
  27. ) ENGINE = myisam DEFAULT charset = utf8;
  28.  
  29. INSERT INTO teacher
  30. VALUES
  31. (1,'wugui','male','计算机网络'),
  32. (2,'woniu','female','C语言'),
  33. (3,'xiaowowo','female','oracle');
  34.  
  35. # 创建第二个数据库
  36. CREATE DATABASE backuptest1;
  37. USE backuptest1;
  38. create table student1 as select * from backuptest.student;
  39. create table teacher1 charset=utf8 engine=myisam as select * from backuptest.teacher;

mysqldump三种备份方式如下:

  1. mysqldump [OPTIONS] database [tables]
  2. mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
  3. mysqldump [OPTIONS] --all-databases [OPTIONS]

备份单个库,此处备份mysql库。重定向符号可以在Linux中等价于mysqldump的-r选项,所以下面的语句是等价的。

  1. [root@xuexi ~]# mysqldump -uroot -p123456 -S /mydata/data/mysql.sock mysql >/tmp/mysql.bak
  2. [root@xuexi ~]# mysqldump -uroot -p123456 -S /mydata/data/mysql.sock -r /tmp/mysql1.bak mysql

查看备份文件,会发现dump单个库的时候不会在输出文件中记录建库语句和use语句

  1. [root@xuexi ~]# less /tmp/mysql.bak
  2. -- MySQL dump 10.13 Distrib 5.6.35, for linux-glibc2.5 (x86_64)
  3. --
  4. -- Host: localhost Database: mysql
  5. -- ------------------------------------------------------
  6. -- Server version 5.6.35-log
  7.  
  8. /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
  9. /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
  10. /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
  11. /*!40101 SET NAMES utf8 */;
  12. /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
  13. /*!40103 SET TIME_ZONE='+00:00' */;
  14. /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
  15. /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
  16. /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
  17. /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
  18.  
  19. --
  20. -- Table structure for table `columns_priv`
  21. --
  22.  
  23. DROP TABLE IF EXISTS `columns_priv`;
  24. /*!40101 SET @saved_cs_client = @@character_set_client */;
  25. /*!40101 SET character_set_client = utf8 */;
  26. ......

备份多个库。

  1. mysqldump -uroot -p123456 -S /mydata/data/mysql.sock --databases backuptest backuptest1 >/tmp/mutil_db.bak

备份所有库。

  1. mysqldump -uroot -p123456 -S /mydata/data/mysql.sock --all-databases >/tmp/all_db.bak

备份多个库或所有库时,会在dump文件中加入建库语句和use语句。实际上,只要使用--databases选项,即使只备份一个库也会加上建库语句和use语句。

  1. [root@xuexi ~]# grep -C 2 -i 'use' /tmp/mutil_db.bak
  2. CREATE DATABASE /*!32312 IF NOT EXISTS*/ `backuptest` /*!40100 DEFAULT CHARACTER SET latin1 */;
  3.  
  4. USE `backuptest`;
  5.  
  6. --
  7. --
  8. CREATE DATABASE /*!32312 IF NOT EXISTS*/ `backuptest1` /*!40100 DEFAULT CHARACTER SET latin1 */;
  9.  
  10. USE `backuptest1`;
  11.  
  12. --

所以使用mysqldump备份的时候,无论何时都建议--databases或者--all-databases选项二选一,这样就免去了连进数据库的过程。

3.2.2 使用DDL选项备份示例

DDL选项如下:

  1. --add-drop-database
  2. --add-drop-table
  3. --add-drop-trigger
  4. -n, --no-create-db
  5. -t, --no-create-info
  6. --replace

--no-create-db将抑制建库语句,所以不建议使用。

--no-create-info将抑制建表语句。使用和不使用的对比如下:

  1. mysqldump -uroot -p123456 -S /mydata/data/mysql.sock --databases backuptest >/tmp/backuptest.bak
  2. mysqldump -uroot -p123456 -S /mydata/data/mysql.sock --no-create-info --databases backuptest >/tmp/backuptest1.bak
  3. vimdiff /tmp/backuptest.bak /tmp/backuptest1.bak

--replace将会把insert语句替换为replace语句。

  1. shell> mysqldump -uroot -p123456 -S /mydata/data/mysql.sock --replace --databases backuptest >/tmp/backuptest2.bak
  2. shell> grep -i 'replace' /tmp/backuptest2.bak
  3. REPLACE INTO `student` VALUES (1,'malongshuai','male','2017-03-31'),(2,'gaoxiaofang','female','2015-03-31'),(3,'longshuai','male','2012-03-31'),(4,'meishaonv','female','2014-03-31'),(5,'tun\'er','female','2013-03-31');
  4. REPLACE INTO `teacher` VALUES (1,'wugui','male','计算机网络'),(2,'woniu','female','C语言'),(3,'xiaowowo','female','oracle');

3.2.3 使用字符集选项示例

dump数据的时候,客户端和数据库的字符集不一致的话会进行字符集转换,转换的过程是不可逆的,所以有可能会导致乱码。

例如,插入一个带有中文字符的记录到字符集为latin1的表student中。

  1. insert INTO backuptest.`student` VALUES (6,'马','male','2017-03-31');

如果提示无法插入,则设置客户端字符集和连接字符集为latin1,character_set_client、character_set_connection、character_set_results,使用set names latin1即可,它会设置它们3个。

插入成功之后,其他会话连接数据库查询将会是乱码的。dump的时候也是乱码的,因为dump默认会使用utf8字符集,在latin1转码为utf8的过程中出现了乱码。

  1. shell> mysqldump -uroot -p123456 -S /mydata/data/mysql.sock --databases backuptest >/tmp/backuptest.bak
  2. shell> grep -i 'insert' /tmp/backuptest.bak
  3. INSERT INTO `student` VALUES (1,'malongshuai','male','2017-03-31'),(2,'gaoxiaofang','female','2015-03-31'),(3,'longshuai','male','2012-03-31'),(4,'meishaonv','female','2014-03-31'),(5,'tun\'er','female','2013-03-31'),(6,'马','male','2017-03-31');
  4. INSERT INTO `teacher` VALUES (1,'wugui','male','计算机网络'),(2,'woniu','female','C语言'),(3,'xiaowowo','female','oracle');

再使用乱码的文件来恢复的话,肯定是乱码的结果。

这时可以指定dump时的字符集为latin1来使得dump数据时无需转换字符集。

  1. shell> mysqldump -uroot -p123456 -S /mydata/data/mysql.sock --default-character-set=latin1 --databases backuptest >/tmp/backuptest.bak
  2. shell> grep -i 'insert' /tmp/backuptest.bak
  3. INSERT INTO `student` VALUES (1,'malongshuai','male','2017-03-31'),(2,'gaoxiaofang','female','2015-03-31'),(3,'longshuai','male','2012-03-31'),(4,'meishaonv','female','2014-03-31'),(5,'tun\'er','female','2013-03-31'),(6,'马','male','2017-03-31');

测试完成之后,将新插入的含有中文字符的记录删除。

  1. delete from backuptest.student where studentid=6;

3.2.4 使用格式化选项示例

格式化选项如下:

  1. --compact
  2. --complete-insert, -c
  3. --create-options
  4. --tab=dir_name, -T dir_name
  5. --fields-terminated-by=name
  6. --fields-enclosed-by=name
  7. --fields-optionally-enclosed-by=name
  8. --fields-escaped-by=name
  9. --lines-terminated-by=name
  10. -Q, --quote-names

选项--compact可以极大的简化输出,让输出变得更加简单明晰。但是却不安全,因为它不止会简化注释语句,还会简化部分非注释语句,如insert前后的lock语句。所以该选项仅用来调试使用。

  1. shell> mysqldump -uroot -p123456 -S /mydata/data/mysql.sock --compact --databases backuptest >/tmp/backuptest.bak
  2. shell> mysqldump -uroot -p123456 -S /mydata/data/mysql.sock --databases backuptest >/tmp/backuptest1.bak
  3. shell> vimdiff /tmp/backuptest.bak /tmp/backuptest1.bak

"--complete-insert, -c"选项会在每个insert语句中列出插入列列表,而默认情况下mysqldump备份时是不加的。

  1. shell> mysqldump -uroot -p123456 -S /mydata/data/mysql.sock --databases backuptest >/tmp/backuptest.bak
  2. shell> mysqldump -uroot -p123456 -S /mydata/data/mysql.sock -c --databases backuptest >/tmp/backuptest1.bak
  3. shell> vimdiff /tmp/backuptest.bak /tmp/backuptest1.bak

--tab选项是将表的结构定义和数据分开dump,结构定义语句dump到表的同名.sql文件中,数据dump到表的同名.txt文件中。--tab指定这些文件的输出目录。但要求mysqldump和MySQL服务器必须在同一台服务器上,且mysql系统用户对指定的输出目录有写权限,连接数据库的用户还需要有file权限。而且该选项不能和--databases或--all-databases一起使用。因为它只能定义表的结构。

一般和该选项一起使用的有:该部分内容见select ... into outfile

  1. --fields-terminated-by=name
  2. --fields-enclosed-by=name
  3. --fields-optionally-enclosed-by=name
  4. --fields-escaped-by=name
  5. --lines-terminated-by=name  

3.2.5 使用筛选选项示例

  1. --all-databases, -A
  2. --databases, -B
  3. --ignore-table=db_name.tbl_name
  4. -d, --no-data
  5. --events, -E
  6. --routines, -R
  7. --triggers
  8. --tables
  9. --where='where_condition', -w 'where_condition'

筛选数据库此处不再赘述。

--ignore-table表示忽略数据库中的某张表不被dump。要忽略多张表的时候多次写该选项即可。例如忽略backuptest.student和backuptest1.student1。

  1. shell> mysqldump -uroot -p123456 -S /mydata/data/mysql.sock --ignore-table backuptest.student --ignore-table backuptest1.student1 --databases backuptest backuptest1 >/tmp/backuptest.bak
  2. shell> grep -i 'student' /tmp/backuptest.bak |wc -l
  3. 0

--no-data表示只dump表的结构,不dump数据。

  1. mysqldump -uroot -p123456 -S /mydata/data/mysql.sock --no-data -d backuptest>/tmp/backuptest.bak
  2.  
  3. grep -i 'insert' /tmp/backuptest.bak | wc -l
  4. 0

--tables指定数据库来导出其中的某些表。只支持指定一个数据库。该选项会覆盖--databases选项,所以不会建库语句和use语句。该选项可以用在分开备份innodb表和myisam表。

  1. mysqldump -uroot -p123456 -S /mydata/data/mysql.sock --tables backuptest student teacher>/tmp/backuptest.bak

--where指定某个表的筛选条件,格式为--where="condition"。如果指定了筛选列,则要导出的表中必须要含有该列。另外,显式指定表时,格式为"db_name tab_list"。以下格式都正确。

  1. # 导出某数据库下的一个表中的筛选数据
  2. mysqldump -uroot -p123456 -S /mydata/data/mysql.sock --where="gender='male'" backuptest student>/tmp/backuptest.bak
  3. # 导出某数据库下多个表中的筛选数据
  4. mysqldump -uroot -p123456 -S /mydata/data/mysql.sock --where="gender='male'" backuptest student teacher>/tmp/backuptest.bak
  5. # 导出多个数据库中的筛选数据
  6. mysqldump -uroot -p123456 -S /mydata/data/mysql.sock --where="gender='male'" --databases backuptest backuptest1>/tmp/backuptest.bak

3.2.6 使用事务选项示例

--add-locks选项是在insert语句前后加上lock tables和unlock tables语句。

--no-autocommit选项是在insert语句前后加上set autocommit=0,并在事务结束的地方加上commit语句。这样插入数据时只需一次提交,可以大幅提升大量插入时的性能。

--flush-logs, -F

在开始dump前先flush logs,如果同时使用了--all-databases,则依次在每个数据库dump前flush;如果同时使用了--lock-all-tables,--master-data或者--single-transaction,则仅flush一次,因为这几个选项是dump前开启一个长事务或者全局锁定。等价于使用flush tables with read lock锁定所有表,这样可以让dump和flush在完全精确的同一时刻执行。

--flush-privileges

在dump完所有数据库后在数据文件的结尾加上flush privileges语句,在导出的数据涉及mysql数据库或者依赖于mysql数据库时都应该使用该选项。

--lock-all-tables, -x

为所有表加上一个持续到dump结束的全局读锁。该选项在dump阶段仅加一次锁,一锁锁永久且锁所有。该选项自动禁用--lock-tables和--single-transaction选项。

--lock-tables, -l

在dump每个数据库前依次对该数据库中所有表加上read local锁(多次加锁,lock tables ... read local),这样就允许对myisam表进行并发插入。对于innodb存储引擎,使用--single-transaction比--lock-tables更好,因为它不完全需要锁定表。因为该选项是分别对数据库加锁的,所以只能保证每个数据库之间的一致性而不能保证在所有数据库之间的一致性。 该选项主要用于myisam表,如果既有myisam又有innodb,则只能使用--lock-tables了,或者分开dump更好。

--single-transaction

该选项在dump前将设置事务隔离级别为repeatable read并发送一个start transaction语句给服务端。该选项对于导出事务表如innodb表很有用,因为它在发出start transaction后能保证导出的数据库的一致性时而不阻塞任何的程序。当使用该选项只能保证innodb表的一致性,对于myisam表是无法保证的。但是在使用该选项的时候,一定要保证没有任何其他数据库的连接在使用ALTER TABLE, CREATE TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE语句,因为一致性读无法隔离这些语句。--single-transaction选项和--lock-tables选项互斥,因为lock tables会隐式提交事务,要导出大的innodb表,该选项结合--quick选项更好。

3.3 mysqldump使用建议

1.从性能考虑:在需要导出大量数据的时候,使用--quick选项可以加速导出,但导入速度不变。如果是innodb表,则可以同时加上--no-autocommit选项,这样大量数据量导入时将极大提升性能。

2.一致性考虑:对于innodb表,几乎没有理由不用--single-transaction选项。对于myisam表,使用--lock-all-tables选项要好于--lock-tables。既有innodb又有myisam表时,可以分开导出,又能保证一致性,还能保证效率。

3.方便管理和维护性考虑:在导出时flush log很有必要。加上--flush-logs选项即可。而且一般要配合--lock-all-tables选项或者--single-transaction选项一起使用,因为同时使用时,只需刷新一次日志即可,并且也能保证一致性。同时,还可以配合--master-data=2,这样就可以方便地知道二进制日志中备份结束点的位置。

4.字符集考虑:如果有表涉及到了中文数据,在dump时,一定要将dump的字符集设置的和该表的字符集一样。

5.杂项考虑:备份过程中会产生二进制日志,但是这是没有必要的。所以在备份前可以关掉,备份完后开启。set sql_log_bin=0关闭,set sql_log_bin=1开启。

以下是备份不同存储引擎类型表的示例:

备份myisam表:需要时加上--default-character-set

  1. set sql_log_bin=0
  2.  
  3. mysqldump -uroot -p123456 -S /mydata/data/mysql.sock -q --lock-all-tables --flush-logs --master-data=2 --tables backuptest teacher >/tmp/myisam.sql ;
  4.  
  5. set sql_log_bin=1

备份innodb表:需要时加上--default-character-set

  1. set sql_log_bin=0
  2.  
  3. mysqldump -uroot -p123456 -S /mydata/data/mysql.sock -q --no-autocommit --flush-logs --single-transaction --master-data=2 --tables backuptest student >/tmp/innodb.sql;
  4.  
  5. set sql_log_bin=1

3.4 mysqldump + 二进制日志备份

mysqldump可以实现全备份,在mysqldump之后再二进制日志备份就相当于增量备份,这样就可以实现全备份之后的定时点还原。

假设要备份的是一张innodb表。使用下面的语句:

  1. mysqldump -uroot -p123456 -S /mydata/data/mysql.sock -q --no-autocommit --flush-logs --single-transaction --master-data=2 --tables backuptest student >/tmp/innodb.sql;

因为dump前会flush二进制日志,所以之后对该表的操作会记录到新的滚动日志中。然后只需备份新的二进制日志即可。

然后在该表中插入一行记录。

  1. insert into student select 10,'xiaolonglong','male','2015-01-02';

备份新的二进制日志。

  1. mysqlbinlog mysql-bin.000002 >/tmp/new_binlog.sql

设计刚才备份的表误操作,如删除该表。

  1. drop table student;

使用该表的完全备份和二进制日志恢复。因为备份时使用的是--tables选项,所以要恢复需要进入数据库指定数据库,然后使用source来加载sql文件。

  1. use backuptest;
  2. source /tmp/innodb.sql;
  3. source /tmp/new_binlog.sql;

3.5 mysqldump工具的评价

mysqldump备份的文件是逻辑SQL语句,总体来说,简单,便捷,在有些时候迁移数据的时候比较有用。另外,它的功能也很多,例如导出数据,导出表结构等。

但是缺点是恢复速度太慢,因为恢复数据时是通过insert不断插入记录的,它的恢复速度远不及load data infile导入数据。

在备份方式上,mysqldump备份myisam表时因为要加--lock-all-tables,这时要备份的数据库全部被上锁,可读不可写,所以实现的是温备。mysqldump备份innodb表时因为要加--single-transaction,会自动将隔离级别设置为repeatable read并开启一个事务,这时mysqldump将获取dump执行前一刻的行版本,并处于一个长事务中直到dump结束。所以不影响目标数据库的使用,可读也可写,即实现的是热备。

MariaDB/MySQL备份和恢复(一):mysqldump工具用法详述的更多相关文章

  1. MariaDB/MySQL备份和恢复(三):xtrabackup用法和原理详述

    本文目录: 1.安装xtrabackup 2.备份锁 3.xtrabackup备份原理说明 3.1 备份过程(backup阶段) 3.2 准备过程(preparing阶段) 3.3 恢复过程(copy ...

  2. MariaDB/MySQL备份和恢复(二):数据导入、导出

    MariaDB/MySQL备份恢复系列: 备份和恢复(一):mysqldump工具用法详述 备份和恢复(二):导入.导出表数据 备份和恢复(三):xtrabackup用法和原理详述 1.导出.导入数据 ...

  3. MySQL备份和恢复[3]-mysqldump备份工具

    mysqldump 概述 逻辑备份工具: mysqldump, mydumper, phpMyAdmin Schema和数据存储在一起.巨大的SQL语句.单个巨大的备份文件 mysqldump:是My ...

  4. MySQL备份方案-->(利用mysqldump以及binlog二进制日志)

                                                         MySQL备份方案-->(利用mysqldump以及binlog二进制日志) 随着数据不 ...

  5. mysql备份灵活恢复

    mysql备份灵活恢复 服务上线遇到一个问题,开始操作前做了全库备份,但是没有做要操作的库备份,如果操作过程出现失败情况需要回退时,直接用全备文件做全库恢复很不妥当. 通过mysql的全备份文件,可以 ...

  6. mysql数据库备份及恢复命令mysqldump,source的用法

    还原一个数据库:mysql -h localhost -u root -p123456 www<c:/www.sql 备份一个数据库:mysqldump -h localhost -u root ...

  7. mysql —备份和恢复

    备份的目的 灾难恢复.硬件故障.软件故障.自然灾害.黑客攻击.误操作测试等数据 丢失场景 备份注意要点 能容忍最多丢失多少数据 恢复数据需要在多长时间内完成 需要恢复哪些数据 还原要点 做还原测试,用 ...

  8. MySQL备份和恢复[1]-概述

    备份类型 完全备份,部分备份 完全备份:整个数据集 部分备份:只备份数据子集,如部分库或表 完全备份.增量备份.差异备份 增量备份:仅备份最近一次完全备份或增量备份(如果存在增量)以来变化的数据,备份 ...

  9. 【MySQL】MySQL备份和恢复

    一.为什么要备份数据 在生产环境中我们数据库可能会遭遇各种各样的不测从而导致数据丢失, 大概分为以下几种. 硬件故障 软件故障 自然灾害 黑客攻击 误操作 (占比最大) 所以, 为了在数据丢失之后能够 ...

随机推荐

  1. Linux信号实践(2) --信号分类

    信号分类 不可靠信号 Linux信号机制基本上是从UNIX系统中继承过来的.早期UNIX系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,它的主要问题是: 1.进程每次处理信号后,就将对信号 ...

  2. C语言assert的用法

    assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:#include <assert.h>void assert( int ...

  3. 海量数据挖掘MMDS week3:流算法Stream Algorithms

    http://blog.csdn.net/pipisorry/article/details/49183379 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...

  4. Android进阶(十四)Android Adapter详解

    Android Adapter详解 Android是完全遵循MVC模式设计的框架,Activity是Controller,layout是View.因为layout五花八门,很多数据都不能直接绑定上去, ...

  5. 10、Libgdx的内存管理

    (官网:www.libgdx.cn) 游戏是非常耗资源的应用.图片和音效可能耗费大量的内存,另一方面来说,这些资源没有被Java垃圾回收,让一个垃圾处理来决定将显存中的5M的图片进行释放也不是一个明知 ...

  6. OS X 10.11 中的安全删除文件

    在 OS X 10.11 中安全倾倒垃圾桶这个功能已经被取消了.是因为 SSD 闪存硬盘的原因 . 安全删除操作并不能安全清除. 所以就直接取消了. 但是其实其实还是可以在系统内使用安全删除功能的. ...

  7. session效率

    (1)-不恰当的request.getSession() 在HttpServlet中,HttpSession对象通常在request.getSession(true)方法调用时才创建. HttpSes ...

  8. how tomcat works 五 servlet容器 上

    servlet容器是用来处理请求servlet资源,并为Web客户端填充response对象的模块.在上一篇文章(也就是书的第四章)我们设计了SimpleContainer类,让他实现Containe ...

  9. 一步操作关闭iOS状态栏(电池栏)

    状态栏某时也蛮碍眼的: 将其关闭很简单:打开项目的info.plist文件,添加新的属性为NO的一行 View controller-based status bar appearance : 最后结 ...

  10. LeetCode(55)- Palindrome Linked List

    题目: Given a singly linked list, determine if it is a palindrome. Follow up: 思路: 题意:判断一个链表是不是回文 利用两个指 ...