一、mysqldump
- mysqldump tool was originally done by Ifor Romanenko write, usually used to complete the backup and migration between different database dump of the database, such as MySQL upgrade from a lower version of the database to a higher version MySQL database, or migrate from MySQL database to Oracle, SQL Server Wait
Note the use of the tool
- ① mysqldump tool is outside the MySQL command line use, not to start using the MySQL database
- ② The tool needs to provide a user name and password to use, it is necessary to change the MySQL configuration file in which to add a user name and password, and then restart the database backup
Case presentation
- Syntax is as follows:
- Back up all databases, you can use the --all-databases option:
mysqldump --all-databases >dump.sql
- Backup specified database, you can use --databases options:
mysqldump --databases db1 db2 db3 >dump.sql
- Demo database backup is performed, you can use the following operations using --single-transaction option to ensure the consistency of the backup:
mysqldump --single-transaction demo >demo_backup.sql
Backup .sql file viewing
- Backed out of the .sql file is a text file that can be viewed using the direct commands
- It can be seen that the file table structure and data, which are SQL statements
- File start and end of the comment section is used to set the parameters of the MySQL database, usually used to restore the work more effective and accurate conduct
parameter
- The tool has a lot of parameters, some parameters is an abbreviated form, for example --lock-tables the abbreviation for the -l
- You can use the following command to see all parameters
mysqldump --help
--single-transaction parameters
- 该参数在备份开始时,先执行START TRANSACTION命令,以此来获得备份的一致性,当前该参数只对InnoDB存储引擎有效
- 当启用该参数并进行备份时,确保没有其他任何的DDL语句执行,因为一致性读并不能隔离DDL操作
--lock-tables(-l)参数
- 在备份中,以此锁住每个数据库下的所有表
- 该参数一般用于MyISAM存储引擎,当备份时只能对数据库进行读取操作,不过备份依然可以保证一致性
- 对于InnoDB存储引擎,不需要使用该参数,用--single-transaction即可
- 注意事项:
- --lock-tables和--single-transaction是互斥的,不能同时使用如果用户的MySQL数据库中,既有MyIASM存储引擎的表,又有InnoDB存储引擎的表,那么用户的选择只有--lock-tables
- 此外,正如前面所说的那样,--lock-tables是依次对每个数据库中的表上锁的,因此只能保证每个数据库下表备份的一致性,而不能保证所有数据库下表的一致性
--lock-all-tables(-x)参数
- 在备份过程中,对所有数据库中的所有表上锁。这个可以避免之前说的--lock-tables参数不能同时锁住所有表的问题
--add-drop-databases参数
- 在create database全先运行drop database
- 这个参数需要和--all-databases或者--databases选项一起使用
- 在默认情况下,导出的文本文件中并不会有create database,除非指定了这个参数,因此可能会看到如下的内容:
--master-data [=value]参数
- 通过该参数产生的备份转存文件主要用来建立一个replication
- 在默认情况下,value为空
- 当value=1时:转存文件中记录change master语句。在备份文件中可以看到:
- 当value=2时:change master语句被注释。在备份文件中可以看到:
--master-data参数
- 该参数会自动忽略--lock-tables选项
- 如果没有使用--single-transaction选项,则会自动使用--lock-all-tables选项
--events(-E)参数
- 备份时间调度器
--routines(-R)参数
- 备份存储过程和函数
--triggers参数
- 备份触发器
--hex-blob参数
- 将binary、varbinary、blog、bit列类型备份为十六进制格式
- mysqldump导出的文件一般是文本文件,但是如果导出的数据中有上述类型,在文本文件模式下可能有些字符不可见,若添加该参数,结果会以十六进制显示,如下所示:
- 这里可以看到用0x6100000000000000的十六进制格式来导出数据
--tab=path(-T path)参数
- 该参数产生TAB分割的数据文件。对于每张表,mysqldump创建一个包含create table语句的table_name.sql文件,和包含数据的tbl_name.txt文件
- 可以使用--fields-terminated-by=...,--fields-enclosed-by=...,-fields-optionally-enclosed-by=...,--fields-escaped-by=...,--lines-terminated-by=...来改变默认的分隔符、换行符等。例如:
- 有些人喜欢使用select...into outfile的方式来导出一张表,但是通过mysqldump一样可以完成工作,而且可以一次完成多张表的导出,并且实现导出数据的一致性
--while='where_condition'(-w 'where_condition')参数
- 导出给定条件的数据
- 例如导出b数据库下的表a,并且表a的数据大于2:
二、select...into outfile
- 该语句也是一种逻辑备份的方法,更准确地说是导出一张表中的数据
语法格式
- FIELDS [TERMINATED BY 'string']:表示每个列的分隔符
- [[OPTIONALLY] ENCLOSED BY 'char']:表示对于字符串的包含符
- [ESCAPED BY 'char']:表示转义符
- [STARTING BY 'string']:表示每行的开始符号
- TERMINATED BY 'string':表示每行的结束符号
- 如果没有指定任何FIELDS和LINES选项,默认使用下面的设置:
- file_name:表示导出的文件,但是文件所在的路径的权限必须是mysql:mysql的,否则MySQL会报出下面的错误:
- 若导出文件已存在,也会报出错误:
演示案例
- 查看通过select into导出的表a文件
- 可以发现默认导出的文件是以TAB进行列分割的,如果想要使用其他分隔符,若“,”们可以使用FIELDS TERMINATED BY 'string'选项,如下:
- 在Windows下,由于换行符时“\r\n”,因此在导出时可能需要指定LINES TERMINATED BY选项,如:
三、逻辑备份的恢复
- mysqldump的恢复操作比较简单,因为备份的文件就是导出的SQL语句,一般只需要执行这个文件就可以了,方法如下:
- 如果在导出时包含了创建和删除数据库的SQL语句,那必须确保删除数据库时,数据库下没有其他与数据库相关的文件,否则会报错:
- 因为逻辑备份的文件是由SQL语句组成的,也可以通过SOURCE命令来执行导出的逻辑备份文件,如下:
视图的备份与恢复
- 通过mysqldump可以恢复数据库,但是经常发生一个问题,mysqldump可以导出存储过程、触发器、事件、数据,但是不能导出视图
- 因此,如果用户的数据库中还是用了视图,那么在用mysqldump备份完数据库后还需要导出视图的定义,或者备份视图定义的frm文件,并在恢复时进行导入,这样才能保证mysqldump数据库的完全恢复
三、load data infile
- 若通过mysqldump -tab,或者通过select into outfile导出的数据需要恢复,这时可以通过load data infile命令来进行导入
- 命令的格式如下:
- 要对服务器文件使用该命令,必须拥有FILE权
- 其中对于导入格式的选项和之前介绍的select into outfile一样
- IGNORE number LINES选项可以忽略导入的前几行
演示案例
- 下面显示一个用命令导入文件的示例,并忽略第一行的导入:
load data infile '/home/mysql/a.txt' into table a;
- 为了加快InnoDB的导入,可能希望导入过程忽略对外建的检查,因此可以使用下面的格式:
set @@foreign_key_checks=0; load data infile '/home/mysql/a.txt' into table a; set @@foreign_key_checks=1;
- 另外可以针对指定的列进行导入,如将数据导入列a、b,而c列等于a、b列之和:
create table b( a int, b int, c int, primary key(a) )engine=innodb; load data infile '/home/mysql/a.txt' into table b fields terminated by ',' (a,b) set c=a+b; select * from b;
四、mysqlimport
- mysqlimport是一个命令行工具,从本质上说,是LOAD DATA INFILE的命令接口,而且大对数的选项都和LOAD DATA INFILE语法相同
- 语法格式如下:
- 和LOAD DATA INFILE不同的是:
- mysqlimport命令可以用来导入多张表
- 并且通过--user-thread参数并发地导入不同的文件。这里的并发是指并发导入多个文件,而不是指mysqlimport可以并发地导入一个文件
- 此外,通常来说并发地对同一张表进行导入,其效果一般都不会比串行的方式好
演示案例
- 通过下面的命令并发地导入2张表:
- 如果上述命令的运行过程中,查看MySQL数据库线程列表,可以看到类似下面的内容:
- 可以看到mysqlimport实际上是同时执行了两句load data infile并发地导入数据