MySQL (InnoDB analysis): 48 --- backup and recovery of (logical backup: mysqldump, select ... into outfile, load data infile, mysqlimport)

一、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并发地导入数据
发布了1481 篇原创文章 · 获赞 1026 · 访问量 38万+

Guess you like

Origin blog.csdn.net/qq_41453285/article/details/104376679