MySQL备份与恢复(二)
1.1. 备份工具:概述
MySQL Enterprise Backup 产品执行 MySQL 数据库热备份操作。该产品的设计目的就是为了高效且可靠地备份由 InnoDB 存储引擎创建的表。为完整起见,该产品还能备份其他存储引擎中的表。您可以在以下位置找到有关 MySQL Enterprise Backup 的更多信息:
http://dev.mysql.com/doc/mysql-enterprise-backup/3.8/en/intro.html
mysqldump
mysqldump 实用程序随 MySQL 分发提供。该实用程序执行逻辑备份,可与任何数据库引擎一起使用。可以使用 crontab (在 Linux 和 UNIX 中)和 Windows 任务调度程序(在 Windows 中)自动运行该实用程序。 mysqldump 没有任何跟踪或报告工具。
mysqlhotcopy
mysqlhotcopy 实用程序也随 MySQL 分发提供。该实用程序执行物理备份,仅用于使用 MyISAM 或 ARCHIVE 数据库引擎的数据库。名称暗指 mysqlhotcopy 执行“热”备份,即不中断数据库可用性。但是,由于已对数据库进行了读取锁定,无法在备份过程中更改,因此最好将其描述为“温”备份。没有随此脚本提供报告或跟踪。
1.1.1. mysqlbackup
MySQL Enterprise Backup ( MEB )基本命令行工具是 mysqlbackup ,通过该工具可以执行如下备份 :
l 热备份
热备份是在数据库运行期间执行的。这种类型的备份不阻止正常的数据库操作,甚至能捕获备份进行期间发生的更改。 mysqlbackup 是 MySQL Enterprise Backup 产品的基本命令行工具。对于 InnoDB 表,此工具可执行热备份操作。
l 温备份
对于非 InnoDB 存储引擎, MySQL Enterprise Backup 执行温备份;运行非 InnoDB 备份时,可以读取数据库表,但不能修改数据库。
l 单文件备份
因为可以将单文件备份传输给其他进程(如磁带备份或 scp 之类的命令),因此可使用此技术将备份放在其他存储设备或服务器上,不会在原始数据库服务器上产生显著的存储开销。
mysqlbackup 物理备份的 InnoDB 相关数据文件包括:
— ibdata* 文件,代表系统表空间,并可能代表某些用户表的数据
— .ibd 文件,其中包含用户表中的数据
— 从 ib_logfile* 文件提取的数据(代表在备份期间发生的更改的重做日志信息),存储在新备份文件 ibbackup_logfile 中 ;
默认情况下, mysqlbackup 备份数据目录中的所有文件。如果指定 --only-known-file-types 选项,则备份仅包括具有 MySQL 公认扩展名的其他文件。
数据目录中的常见文件:
— .opt 文件:数据库配置信息
— .TRG 文件:触发器参数
— .MYD 文件: MyISAM 数据文件
— .MYI 文件: MyISAM 索引文件
— .FRM 文件:表数据字典文件
有关这些公认扩展名的完整列表,请参阅以下 URL :
http://dev.mysql.com/doc/mysql-enterprise-backup/3.8/en/meb-files-overview.html
1) mysqlbackup 备份
mysqlbackup 是一种易于使用的工具,适用于所有备份和恢复操作。
基本用法:
mysqlbackup -u<user> -p<password> --backup_dir=<backup-dir> backup-and-apply-log
— backup :执行备份初始阶段
— backup-and-apply-log :包括备份的初始阶段以及第二个阶段,即将 InnoDB 表放到最新的备份中,其中包括在备份运行期间对数据所做的任何更改。
使用 mysqlbackup 联机备份 InnoDB 表以及生成对应于与 InnoDB 备份相同的 binlog 位置的 MyISAM 表的快照。除了创建备份以外, mysqlbackup 还可以将备份数据打包和解包,将在备份操作过程中对 InnoDB 表所做的任何更改应用于备份数据,以及将数据、索引和日志文件复制回其原始位置。
备份过程
a) mysqlbackup 打开到要执行备份的 MySQL 服务器的连接。
b) 然后 mysqlbackup 对 InnoDB 表执行联机备份。此阶段不会干扰正常的数据库处理。
c) 当 mysqlbackup 运行几乎完成时,执行 SQL 命令 FLUSH TABLES WITH READ LOCK ,然后将非 InnoDB 文件(如 MyISAM 表和 .frm 文件)复制到备份目录。如果此时未在数据库中长时间运行 SELECT 或其他查询,则 MyISAM 表很小,锁定阶段仅持续几秒钟。否则,包括 InnoDB 类型表在内的整个数据库都会锁定,直到在备份之前开始的所有长时间查询完成。
d) mysqlbackup 运行完成,并对表执行 UNLOCK 解锁。
2) 使用 mysqlbackup 恢复备份
基本用法:
mysqlbackup --backup-dir=<backup-dir> copy-back
— <backup-dir> :指定备份文件的存储位置;恢复操作将 <backup-dir> 的内容(包括 InnoDB 和 MyISAM 索引)以及 .frm 文件恢复到其原始位置(由 <cnf-file> 文件定义)。
— copy-back :指示 mysqlbackup 执行恢复操作使用 copy-back 选项必须先关闭数据库服务器,然后才能使用 mysqlbackup 与 copy-back 选项。使用此选项时,可将数据文件、日志及其他备份文件从备份目录复制回到其原始位置,并对其执行任何必需的后期处理。在 copy-back 过程中, mysqlbackup 无法从服务器查询其设置,因此从标准配置文件中读取 datadir 之类选项。如果要恢复到不同的服务器,则可使用 --defaults-file 选项提供非标准默认设置文件。 例如 : mysqlbackup -uroot -p --socket /var/lib/mysql/mysql.sock --backup-image=/u01/mysql/bakup/mysql_server.mbi --backup-dir=/u01/mysql/backup backup-to-image
3) mysqlbackup 单文件备份
基本用法:
mysqlbackup -u<user> -p<password> --backup-image=<image-file> --backup_dir=<backup-dir> backup-to-image
— 标准输出:
... --backup-dir=<backup-dir> --backup-image=-backup-to-image > <image-file>
— 将现有的备份目录转换为单个文件:
... --backup-dir=<backup-dir> --backup-image=<image-file> backup-dir-to-image
4) 恢复 mysqlbackup 单个文件备份
提取选择的文件:
mysqlbackup -u<user> -p<password> --backup-image=<image-file>
--backup_dir=<backup-dir> image-to-backup-dir
其他情形
— 列出内容:
... --backup-image=<image-file> list-image
— 将现有的备份目录转换为单个文件:
... --backup-image=<image_file> --src-entry=<file-to-extract>
--dst-entry=<file-to-extract> extract
l --src-entry :确定要从单文件备份中提取的文件或目录
l --dst-entry :与单文件备份配合使用,将单个文件或目录提取到用户指定的路径
有关单文件备份和恢复选项的完整列表,请访问:
http://dev.mysql.com/doc/mysql-enterprise-backup/3.8/en/backup-single-file-options.html
5) mysqlbackup 备份恢复实例
a) mysqlbackup 安装
rpm -ivh /u01/meb-4.1.1-el6.x86_64.rpm
rpm -ql meb
ln -s /opt/mysql/meb-4.1/bin/mysqlbackup /usr/bin/mysqlbackup
b) backup 用户与权限
下面是官方给出的备份的最小用户权限:
CREATE USER 'mysqlbackup'@'localhost' IDENTIFIED BY 'new-password';
GRANT RELOAD ON *.* TO 'mysqlbackup'@'localhost';
GRANT CREATE, INSERT, DROP, UPDATE ON mysql.backup_progress TO 'mysqlbackup'@'localhost';
GRANT CREATE, INSERT, SELECT, DROP, UPDATE, ALTER ON mysql.backup_history TO 'mysqlbackup'@'localhost';
GRANT REPLICATION CLIENT ON *.* TO 'mysqlbackup'@'localhost';
GRANT SUPER ON *.* TO 'mysqlbackup'@'localhost';
GRANT PROCESS ON *.* TO 'mysqlbackup'@'localhost';
GRANT SELECT ON performance_schema.replication_group_members TO 'mysqlbackup'@'localhost';
4.1.2 后还需要的权限:
GRANT CREATE, INSERT, DROP ON mysql.backup_history_old TO 'mysqlbackup'@'localhost';
GRANT CREATE, INSERT, DROP, ALTER ON mysql.backup_history_new TO 'mysqlbackup'@'localhost';
使用 TTS 和 SBT 特性还需要的权限:
GRANT LOCK TABLES, SELECT, CREATE, DROP, FILE ON *.* TO 'mysqlbackup'@'localhost';
GRANT CREATE, INSERT, DROP, UPDATE ON mysql.backup_sbt_history TO 'mysqlbackup'@'localhost';
c) 备份、验证、还原
备份:
mysqlbackup --user=root --password --host=127.0.0.1 --backup-image=/home/admin/backups/my.mbi --backup-dir=/home/admin/backup-tmp backup-to-image
验证:
mysqlbackup --backup-image=/home/admin/backups/my.mbi validate
mysqlbackup --backup_dir=/u01/mysql/backup0 validate
还原:
mysqlbackup --defaults-file=/u01/mysql/mynewdata.cnf --backup-dir=/u01/mysql/backup0 copy-back-and-apply-log
mysqlbackup --defaults-file=/u01/mysql/mynewdata.cnf --backup-dir=/u01/mysql/backup0 copy-back
d) 备份场景和示例
Example 1 Single-File Backup to Absolute Path
mysqlbackup --backup-image=/backups/sales.mbi --backup-dir=/backup-tmp backup-to-image
Example 2 Single-File Backup to Relative Path
mysqlbackup --backup-image=sales.mbi --backup-dir=/backups backup-to-image
Example 3 Single-File Backup to Standard Output
mysqlbackup --backup-dir=/backups --backup-image=- backup-to-image > /backup/mybackup.mbi
Example 4 Convert Existing Backup Directory to Single Image
mysqlbackup --backup-image=/backup/my.mbi --backup-dir=/var/mysql/backup backup-dir-to-image
Example 5 Extract Existing Image to Backup Directory
mysqlbackup --backup-dir=/var/backup --backup-image=/backup/my.mbi image-to-backup-dir
Example 6 List Single-File Backup Contents
mysqlbackup --backup-image=/backup/my.mbi list-image
Example 7 Validate a Single-File Backup
mysqlbackup --backup-image=/logs/fullimage.mi validate
Example 8 Extract Single-File Backup into Current Directory
mysqlbackup --backup-image=/var/my.mbi extract
Example 9 Extract Single-File Backup into a Backup Directory
mysqlbackup --backup-image=/var/my.mbi --backup-dir=/var/backup extract
Example 10 Selective Extract of Single File
mysqlbackup --backup-image=/var/my.mbi \
--src-entry=meta/comments.txt extract
mysqlbackup --backup-image=/var/my.mbi \
--src-entry=meta/comments.txt \
--dst-entry=/tmp/mycomments.txt extract
mysqlbackup --backup-image=/var/my.mbi --src-entry=meta/comments.txt --dst-entry=- extract
Example 11 Selective Extract of Single Directory
mysqlbackup --backup-image=/backup/my.mbi --src-entry=meta extract
mysqlbackup --backup-image=/backup/my.mbi --src-entry=meta \
--dst-entry=/tmp/my-meta extract
Example 12 Dealing with Absolute Path Names
mysqlbackup --backup-image=/backup/my.mbi --src-entry=/ --dst-entry=/myroot extract
mysqlbackup --backup-image=/backup/my.mbi --src-entry=. extract
Example 13 Single-File Backup to a Remote Host
mysqlbackup --defaults-file=~/my_backup.cnf --backup-image=- --backup-dir=/tmp backup-to-image | \
ssh <user name>@<remote host name> 'cat > ~/backups/my_backup.img'
Example 14 Single-file Backup to a Remote MySQL Server
mysqlbackup --backup-dir=backup --backup-image=- --compress backup-to-image | \
ssh <user name>@<remote host name> 'mysqlbackup --backup-dir=backup_tmp --datadir=/data \
--innodb_log_group_home_dir=. \
--innodb_log_files_in_group=<innodb_log_files_in_group_of_backedup_server> \
--innodb_log_file_size=<innodb_log_file_size_of_backedup_server> \
--innodb_data_file_path=<innodb_data_file_path_of_backedup_server> \
--uncompress --backup-image=- copy-back-and-apply-log'
Example 15 Stream a Backup Directory to a Remote MySQL Server
mysqlbackup --backup-image=- --backup-dir=/path/to/my/backup backup-dir-to-image | \
ssh <user name>@<remote host name> 'mysqlbackup --backup-dir=backup_tmp --datadir=/data --backup-image=- copy-back-and-apply-log'
e)mysqlbackup 备份与恢复示例
示例 1 :全库备份
mysqlbackup -uroot -p --socket /var/lib/mysql/mysql.sock --backup_dir=/u01/mysql/backup backup-and-apply-log
mysqlbackup --backup-dir=/u01/mysql/backup copy-back
注意: datadir,tbsdir 等目录文件,恢复过来的要检查用户与属组
chown -R mysql.mysql /var/lib/mysql
#mysqld stop, 如果要恢复的文件目录存在,则需要 --force 选项
示例 2 :
mysqlbackup -uroot -p --socket /var/lib/mysql/mysql.sock --backup-image=/u01/mysql/bakup/mysql_server.mbi --backup-dir=/u01/mysql/backup copy-back-and-apply-log
mysqlbackup -uroot -p --socket /var/lib/mysql/mysql.sock --backup-image=/u01/mysql/bakup/mysql_server.mbi --backup-dir=/u01/mysql/backup backup-to-image
chown -R mysql.mysql /usr/local/mysql/data
示例 3 :
mysqlbackup -uroot -paa12AA,. --socket=/u01/mysql/newdata/mysql.sock --backup_dir=/u01/mysql/backup0 backup
mysqlbackup --defaults-file=/u01/mysql/mynewdata.cnf --backup-dir=/u01/mysql/backup0 copy-back
1.1.2. mysqlhotcopy
1) 基本用法
这个实用程序在 MySQL 5.6.20 中被废弃,在 MySQL 5.7 中被删除。
mysqlhotcopy -u<user> -p<password> <db_name> <backup-dir>
选项:
--flush-log :在所有表都锁定后刷新日志
--record_log_pos = db_name.tbl_name :在指定的数据库 db_name 和表 tbl_name 中记录主从服务器状态
mysqlhotcopy 连接到本地 MySQL 服务器,并复制表文件。在完成复制操作后,将表解锁。在服务器主机上运行 mysqlhotcopy ,以便在表锁定期间复制表文件。服务器必须处于运行状态,以便 mysqlhotcopy 连接到服务器。 mysqlhotcopy 的操作速度很快,因为它直接复制表文件,而不是通过网络备份表文件。
2) 选项和参数详细介绍
mysqlhotcopy 是一个 Perl 脚本,最初是由 Tim Bunce 编写并贡献的。它使用 FLUSH TABLES , LOCK TABLES 和 cp 、 scp 进行数据库备份。这是对数据库或单个表进行备份的一种快速方法,但只能在数据库目录所在的同一台机器上运行。 mysqlhotcopy 只用于备份 MyISAM 和 ARCHIVE 表,并 仅限于在 Unix 系统上使用;。
要使用 mysqlhotcopy ,您必须具有对正在备份的表的文件的读访问权、这些表的 SELECT 权限、 RELOAD 权限 ( 能够执行 FLUSH TABLES) 和 LOCK tables 权限 ( 能够锁定表 ) 。
shell> mysqlhotcopy db_name [/path/to/new_directory]
shell> mysqlhotcopy db_name_1 ... db_name_n /path/to/new_directory
备份给定数据库中匹配正则表达式的表 :
shell> mysqlhotcopy db_name. / 正则表达式 /
表名的正则表达式可以用波浪号 (~) 前缀来否定 :
shell> mysqlhotcopy db_name. / ~ 正则表达式 /
mysqlhotcopy 支持以下选项,这些选项可以在命令行或选项文件的 [mysqlhotcopy] 和 [client] 组中指定。有关 MySQL 程序使用的选项文件的信息,请参见 4.2.2.2 节 “ 使用选项文件 ” 。
mysqlhotcopy 选项名称含义描述:
--addtodest 不重命名目标目录 ( 如果存在 ) ,只是添加文件
--allowold 如果目标存在,不要中止 ; 通过添加 _old 后缀来重命名它
--checkpoint 插入检查点条目
--chroot Base directory of the chroot jail in which mysqld operates
--debug 写调试日志
--dryrun report 未执行的操作
--flushlog 所有表都被锁定后刷新日志
--help, -? 显示帮助信息并退出
--host 连接到给定 MySQL 服务器主机上
--keepold 完成后,不要删除以前的 (renamed) 目标
--method 复制文件的方法
--noindices 在备份中不包含完整的索引文件
--old_server 连接到不支持 FLUSH TABLES tbl_list WITH READ LOCK 的服务器
--password 连接到服务器时使用的密码
--port tcp /IP 端口号
--quiet 保持静默模式,除非报错
--regexp 使用与给定正则表达式匹配的名称复制所有数据库
--resetmaster 在锁定所有表后重置 binlog
--resetslave 在锁定所有表之后重置 master.info 文件
--socket 用于连接到要使用的 Unix 套接字文件 localhost
--tmpdir 临时目录
--user 连接到服务器时使用的 mysql 用户名
使用 perldoc 获得更多的 mysqlhotcopy 文档,包括关于 --checkpoint 和 --record_log_pos 选项所需的表结构的信息 :
shell> perldoc mysqlhotcopy
1.1.3. mysqldump
mysqldump 客户机实用程序执行逻辑备份,生成一组 SQL 语句,可以执行这些 SQL 语句来重建原始数据库对象定义和表数据。它可以转储一个或多个 MySQL 数据库,以便备份或传输到另一个 SQL 服务器, mysqldump 命令还可以生成 CSV 、其他分隔符文本或 XML 格式的输出。
mysqldump 至少要求对 TABLE 具有 SELECT 权限,对转储 VIEW 具有 SHOW VIEW ,对转储触发器具有 TRIGGER ,如果不使用 --single-transaction 选项,则需要锁定表。某些选项可能需要其他权限,如选项描述中所述。
要 RELOAD 转储文件,您必须具有执行其中包含的语句所需的权限,例如这些语句创建的对象的适当权限。
mysqldump 输出可以包括更改 database collation 的 ALTER DATABASE 语句。当转储存储过程以保存其字符编码时,也可以使用 mysqldump 。要 reload 包含此类语句的转储文件,需要受影响数据库的 ALTER 权限。 注意事项:
在 Windows 上使用 PowerShell 进行转储并输出重定向,将创建一个具有 UTF-16 编码的文件 :
shell> mysqldump [options] > dump.sql
但是, UTF-16 不允许作为连接字符集 ( 请参阅不允许的客户机字符集 ) ,因此转储文件将无法正确加载。要解决这个问题,可以使用 --result-file 选项,它以 ASCII 格式创建输出 :
shell> mysqldump [options]--result-file=dump.sql
Ø 性能和扩展性的考虑
mysqldump 的优点包括在恢复之前查看甚至编辑输出的方便和灵活性。您可以为开发和 DBA 工作克隆数据库,或者为测试生成现有数据库的细微变化。 它不是用于备份大量数据的快速或可伸缩的解决方案。 对于较大的数据大小,即使备份步骤花费了合理的时间,恢复数据也可能非常慢,因为重播 SQL 语句涉及磁盘 I/O ,以便插入、创建索引等等。
对于大规模的备份和恢复,物理备份更合适,复制数据文件的原始格式,可以快速恢复 :
l 如果您的表主要是 InnoDB 表,或者是 InnoDB 和 MyISAM 表的组合,请考虑使用 MySQL Enterprise Backup 产品的 mysqlbackup 。它为 InnoDB 备份提供了最优的性能,且破坏最小;它还可以从 MyISAM 和其他存储引擎备份表;它提供了许多方便的选项来适应不同的备份场景。参见第 25.2 节 “MySQL 企业备份概述 ” 。
l 如果您的表主要是 MyISAM 表,并且是 5.6.20 以前版本,可以考虑使用 mysqlhotcopy ,以获得比 mysqldump 更好的备份和恢复操作性能。
mysqldump 可以逐行检索和转储表内容,也可以从表中检索整个内容,并在转储前将其缓冲到内存中。如果要转储大表,那么内存中的缓冲可能是个问题。要逐行转储表,可以使用 --quick 选项 ( 或者 --opt ,它启用了 --quick) 。默认情况下启用了 --opt 选项 ( 因此也就是 --quick) ,因此要启用内存缓冲,请使用 --skip-quick 。
如果使用最新版本的 mysqldump 生成要 reload 到非常旧的 MySQL 服务器的转储,请使用 --skip-optoption 而不是 --opt 或 --extended-insert 选项。 有关 mysqldump 的更多信息,请参见 https://dev.mysql.com/doc/refman/5.7/en/using-mysqldump.html
Ø mysqldump 限制
默认情况下, mysqldump 不会转储 INFORMATION_SCHEMA 或 performance_schema 数据库。要转储其中任何一个,请在命令行上显式地命名它。您还可以使用 --databases 选项来命名它。另外,使用 --skip-lock-tables 选项。
mysqldump 不转储 NDB 集群 ndbinfo 信息数据库。
如果您遇到由于权限不足而备份视图的问题,请参阅 C.5 节 “ 视图的限制 ” 了解解决方案。
1) mysqldump 优点 使用 mysqldump 将表内容转储到文件的优点:
a) 允许所有数据库、特定数据库或特定表
b) 允许备份本地服务器或远程服务器
c) 与存储引擎无关
d) 以文本格式写入
e) 可移植性强
f) 卓越的复制 / 移动策略
g) 适用于小规模导出,但不适用于完整备份解决方案
2) mysqldump 调用语法
mysqldump 三种常用用法:
shell> mysqldump [options] db_name [tbl_name ...]
shell> mysqldump [options] --databases db_name ...
shell> mysqldump [options] --all-databases
基本用法:
mysqldump --user=<user> --password=<password> --opt db_name > backup.file
对于包含用于重新创建表的 CREATE TABLE 和 INSERT 语句的 SQL 格式转储文件,服务器会将表内容发送到 mysqldump ,这将在客户机主机上写入文件。
例如 :
mysqldump --user=root --password --all-databases=TRUE > backup.file
3) mysqldump 一致性备份
确保备份的一致性:
l 仅限 --master-data 选项:在备份过程中锁定表,在备份文件中记录 binlog 位置
l --master-data 和 --single-transaction 选项一起使用;不锁定表,但仅保证 InnoDB 表一致性。
l --lock-all-tables 通过锁定表实现一致性
l --flush-logs 启动新的二进制日志
4) mysqldump 输出格式选项 删除选项:
--add-drop-database # 将一条 DROP DATABASE 语句添加到每条 CREATE DATABASE 之前
--add-drop-table # 将一条 DROP TABLE 语句添加到每条 CREATE TABLE 语句之前 创建选项:
--no-create-db # 不执行 CREATE DATABASE 语句
--no-create-info # 不执行 CREATE TABLE 语句
--no-data # 创建数据库和表结构,但不转储数据
--no-tablespaces # 指示 MySQL 服务器不写入任何 CREATE LOGFILE GROUP 或 CREATE TABLESPACE 语句到输出 MySQL 编程组件:
--routines # 从已转储的数据库中转储存储例程(过程和函数)
--triggers # 转储每个已转储表的触发器 选项中的最高选项 (--opt):
--opt # 用于创建高效完整的备份文件的最常用选项的快捷方式。 所有 mysqldump Options :
|
Option Name |
Description |
|
--add-drop-database |
在每个 CREATE DATABASE 语句之前添加 DROP DATABASE 语句 |
|
--add-drop-table |
在每个 CREATE TABLE 语句之前添加 DROP TABLE 语句 |
|
--add-drop-trigger |
在每个 CREATE TRIGGER 语句之前添加 DROP TRIGGER 语句 |
|
--add-locks |
用 LOCK TABLES 和 UNLOCK TABLES 语句包围每个表转储 |
|
--all-databases |
转储所有数据库中的所有表 |
|
--allow-keywords |
允许创建作为关键字的列名 |
|
--apply-slave-statements |
包括在 CHANGE MASTER 语句之前 STOP SLAVE ,在输出结束时 START SLAVE |
|
--bind-address |
使用指定的网络接口连接到 MySQL 服务器 |
|
--character-sets-dir |
安装字符集的目录 |
|
--comments |
向转储文件添加注释 |
|
--compact |
产生更紧凑的输出 |
|
--compatible |
生成与其他数据库系统或旧 MySQL 服务器更兼容的输出 |
|
--complete-insert |
使用包含列名的完整 INSERT 语句 |
|
--compress |
压缩客户端和服务器之间发送的所有信息 |
|
--create-options |
在 CREATE table 语句中包含所有特定于 mysql 的表选项 |
|
--databases |
将所有名称参数解释为数据库名称 |
|
--debug |
编写调试日志 |
|
--debug-check |
程序退出时打印调试信息 |
|
--debug-info |
当程序退出时,打印调试信息、内存和 CPU 统计信息 |
|
--default-auth |
要使用的验证插件 |
|
--default-character-set |
指定默认字符集 |
|
--defaults-extra-file |
除了通常的选项文件外,还要读取指定的选项文件 |
|
--defaults-file |
只读指定的选项文件 |
|
--defaults-group-suffix |
选项组后缀值 |
|
--delayed-insert |
编写插入延迟语句而不是插入语句 |
|
--delete-master-logs |
在主复制服务器上,执行转储操作后删除二进制日志 |
|
--disable-keys |
对于每个表,用语句包围 INSERT 语句来禁用和启用键 |
|
--dump-date |
如果给出了注释,则将转储日期包含为 “dump completed on” 注释 |
|
--dump-slave |
包含 CHANGE MASTER 语句,该语句列出 master 的二进制日志坐标 |
|
--enable-cleartext-plugin |
启用 cleartext 身份验证插件 |
|
--events |
从转储数据库中转储事件 |
|
--extended-insert |
使用多行 INSERT 语法 |
|
--fields-enclosed-by |
此选项与 --tab 选项一起使用,其含义与 LOAD DATA 的对应子句相同 |
|
--fields-escaped-by |
此选项与 --tab 选项一起使用,其含义与 LOAD DATA 的对应子句相同 |
|
--fields-optionally-enclosed-by |
此选项与 --tab 选项一起使用,其含义与 LOAD DATA 的对应子句相同 |
|
--fields-terminated-by |
此选项与 --tab 选项一起使用,其含义与 LOAD DATA 的对应子句相同 |
|
--flush-logs |
在开始转储之前刷新 MySQL 服务器日志文件 |
|
--flush-privileges |
在转储 mysql 数据库之后发出一个 FLUSH PRIVILEGES 语句 |
|
--force |
即使在表转储期间发生 SQL 错误,也要继续 |
|
--help |
显示帮助信息并退出 |
|
--hex-blob |
使用十六进制表示法转储二进制列 |
|
--host |
要连接到的主机 (IP 地址或主机名 ) |
|
--ignore-table |
不转储指定的表 |
|
--include-master-host-port |
在使用 --dump-slave 生成的 CHANGE MASTER 语句中包含 MASTER_HOST/MASTER_PORT 选项 |
|
--insert-ignore |
编写 INSERT IGNORE 而不是 INSERT 语句 |
|
--lines-terminated-by |
此选项与 --tab 选项一起使用,其含义与 LOAD DATA 的对应子句相同 |
|
--lock-all-tables |
跨所有数据库锁定所有表 |
|
--lock-tables |
转储前锁表 |
|
--log-error |
在命名文件中添加警告和错误 |
|
--login-path |
从 .mylogin.cnf 中读取登录路径选项 |
|
--master-data |
将二进制日志文件名和位置写入输出 |
|
--max-allowed-packet |
从服务器发送或接收的最大数据包长度 |
|
--net-buffer-length |
TCP/IP 和套接字通信的缓冲区大小 |
|
--no-autocommit |
将每个转储表的 INSERT 语句封装在 SET autocommit = 0 和 COMMIT 语句中 |
|
--no-create-db |
不写 CREATE DATABASE 语句 |
|
--no-create-info |
不写重新创建每个转储的表的 CREATE TABLE 语句 |
|
--no-data |
不转储表内容 |
|
--no-defaults |
不读取 default 选项文件 |
|
--no-set-names |
--skip-set-charset 一样 |
|
--no-tablespaces |
不写任何 CREATE LOGFILE GROUP or CREATE TABLESPACE 语句 |
|
--opt |
--add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset 的简写 |
|
--order-by-primary |
转储按其主键或第一个惟一索引排序的每个表的行 |
|
--password |
连接到服务器时使用的密码 |
|
--pipe |
在 Windows 上,使用命名管道连接到服务器 |
|
--plugin-dir |
安装插件的目录 |
|
--port |
用于连接的 TCP/IP 端口号 |
|
--print-defaults |
打印默认选项 |
|
--protocol |
使用的连接协议 |
|
--quick |
每次从服务器中逐行检索表的行 |
|
--quote-names |
反勾字符中的引号标识符 |
|
--replace |
编写 REPLACE 语句而不是 INSERT 语句 |
|
--result-file |
直接输出到给定的文件 |
|
--routines |
从转储数据库中转储存储的例程 ( 过程和函数 ) |
|
--secure-auth |
不发送旧 (4.1 前 ) 格式的密码到服务器 , 5.7.5 弃用 |
|
--set-charset |
将集合名 default_character_set 添加到输出 |
|
--set-gtid-purged |
是否添加 SET @@GLOBAL.GTID_PURGED 输出 |
|
--shared-memory-base-name |
用于 shared-memory 连接的共享内存的名称 |
|
--single-transaction |
在从服务器转储数据之前发出 BEGIN SQL 语句 |
|
--skip-add-drop-table |
不要在每个 CREATE TABLE 语句之前添加 DROP TABLE 语句 |
|
--skip-add-locks |
不要添加锁 |
|
--skip-comments |
不向转储文件添加注释 |
|
--skip-compact |
不生产更紧凑的输出 |
|
--skip-disable-keys |
不要禁用键 |
|
--skip-extended-insert |
关掉 extended-insert |
|
--skip-opt |
关闭由 --opt 设置的选项 |
|
--skip-quick |
不从服务器一次一行检索表的行 |
|
--skip-quote-names |
不要引用标识符 |
|
--skip-set-charset |
不写 SET NAMES 语句 |
|
--skip-triggers |
不要转储触发器 |
|
--skip-tz-utc |
关掉 tz-utc |
|
--socket |
要连接到本地主机,请使用 Unix 套接字文件 |
|
--ssl |
启用加密连接 |
|
--ssl-ca |
包含受信任 SSL 证书颁发机构列表的文件 |
|
--ssl-capath |
包含可信 SSL 证书颁发机构证书文件的目录 |
|
--ssl-cert |
包含 X.509 证书的文件 |
|
--ssl-cipher |
连接加密的允许密码列表 |
|
--ssl-crl |
包含证书撤销列表的文件 |
|
--ssl-crlpath |
包含证书撤销列表文件的目录 |
|
--ssl-key |
包含 X.509 键的文件 |
|
--ssl-mode |
连接到服务器的安全状态 |
|
--ssl-verify-server-cert |
根据服务器证书公共名称标识验证主机名 |
|
--tab |
生成制表符分隔的数据文件 |
|
--tables |
覆盖 --databases 或 -B 选项 |
|
--triggers |
每个转储表的转储触发器 |
|
--tz-utc |
将 SET TIME_ZONE='+00:00' 添加到转储文件 |
|
--user |
连接到服务器时使用的 MySQL 用户名 |
|
--verbose |
详细模式 |
|
--version |
显示版本信息并退出 |
|
--where |
只转储由给定 WHERE 条件选择的行 |
|
--xml |
生成 XML 输出 |
更详细参数解释参见 https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html
5) 使用 mysqldump 备份恢复
Ø reload mysqldump 备份
在使用 mysql 命令 reload mysqldump 输出时,必须为恢复的数据库提供一个名称(如果转储文件本身不提供名称)。如果通过调用 mysqldump 与 --database 或 --all-databases 选项创建转储文件,则在从转储文件 reload 时,不需要指定目标数据库名称。在这种情况下,转储文件包含相应的 USE db_name 语句。
mysql --login-path=<login-path> <database> < backup_file.sql
Ø 从一个数据库复制到另一个数据库
可以使用 mysqldump 输出恢复表或数据库并复制它们。 mysql 可以从管道中读取,因此可以在一个命令中结合使用 mysqldump 和 mysql ,在数据库之间复制表。也可以使用管道技术通过网络将数据库或表复制到其他服务器:
shell> mysqldump -u<user> -p<password> <orig-db> <table> |mysql --login-path=<login-path> <copy-db>
6) mysqldump 用法示例
备份数据库:实际上转储的是数据库中的表
shell> mysqldump db_name > backup-file.sql
#mysqldump -uroot -paa12AA,. -S /u01/mysql/newdata/mysql.sock test >db_test.txt
reload 方法一:
shell> mysql db_name < backup-file.sql
reload 方法二 :
shell> mysql -e "source /path-to-backup/backup-file.sql" db_name
使用 mysqldump 复制数据到远程数据库:
shell> mysqldump --opt db_name | mysql --host=remote_host -C db_name
备份多个数据库:
shell> mysqldump --databases db_name1 [db_name2 ...] > my_databases.sql
备份所有数据库:
shell> mysqldump --all-databases > all_databases.sql
对于
InnoDB
tables
,使用
mysqldump
在线备份
:
shell> mysqldump --all-databases --master-data --single-transaction > all_databases.sql
该备份在转储开始时,获取所有表上的全局读锁 ( 使用 FLUSH TABLES WITH READ LOCK) 。一旦获得这个锁,就读取二进制日志坐标并释放锁。如果在发出 FLUSH 语句时长时间运行 update 语句, MySQL 服务器可能会停止,直到这些语句完成。在此之后,转储变为无锁的,并且不会干扰表上的读和写。如果 MySQL 服务器接收到的 update 语句很短 ( 就执行时间而言 ) ,那么即使有很多更新,初始锁定期也不应该很明显。
时间点恢复 point-in-time recovery ( 也称为 “roll-forward”, 当你需要恢复旧的备份和重播备份以来发生的变化 ) ,循环二进制日志很有用或至少知道二进制日志转储对应的坐标 :
shell> mysqldump --all-databases --master-data=2 > all_databases.sql
或者 :
shell> mysqldump --all-databases --flush-logs --master-data=2
> all_databases.sql
可以同时使用 --master-data 和 --single-transaction 选项,如果表是使用 InnoDB 存储引擎存储的,这就提供了一种方便的方法,使在线备份适合在时间点恢复之前使用。 • 除了某些功能外,要选择 --opt 的效果,请为每个功能使用 --skip 选项。要禁用 extended inserts 和 memory buffering ,请使用 --opt --skip-extended-insert --skip-quick 。 ( 实际上, --skip-extended-insert --skip-quick 就足够了,因为 --opt 默认为 on 。 ) • 相反, --opt 除禁用索引和表锁定之外的所有功能,使用 --skip-opt --disable-keys --lock-tables 。
1.1.4. mysqlimport
mysqlimport 客户机为 LOAD DATA SQL 语句提供一个命令行接口。 mysqlimport 的大多数选项都直接对应于 LOAD DATA 语法的子句。
调用 mysqlimport:
shell> mysqlimport [options] db_name textfile1 [textfile2…]
对于命令行中命名的每个文本文件, mysqlimport 从文件名中删除任何扩展名,并使用结果确定要将文件内容导入其中的表的名称。例如,名为 patient.txt, patient.text 和 patient 的文件都将导入到一个名为 patient 的表中。
要 reload 表,可将位置更改为备份目录,通过使用 mysql 执行 .sql 文件,然后使用 mysqlimport 装入 .tsv 文件:
shell> cd <backup_dir>
shell> mysql --login-path=<login-path> <database> < table.sql
shell> mysqlimport -u<user> -p<password> <database> table.tsv
如果 --tab 选项与执行格式控制的 --fields-terminated-by 和 --fields-enclosed-by 之类的选项组合,则可使用 mysqlimport 指定相同的格式控制选项,使其知道如何解释数据文件。
1) mysqlimport Options
mysqlimport 支持以下选项,这些选项可以在命令行或选项文件的 [mysqlimport] 和 [client] 组中指定。
|
Option Name |
Description |
|
--bind-address |
使用指定的网络接口连接到 MySQL 服务器 |
|
--columns |
此选项以逗号分隔的列名列表作为其值 |
|
--compress |
压缩客户端和服务器之间发送的所有信息 |
|
--debug |
编写调试日志 |
|
--debug-check |
程序退出时打印调试信息 |
|
--debug-info |
当程序退出时,打印调试信息、内存和 CPU 统计信息 |
|
--default-auth |
要使用的验证插件 |
|
--default-character-set |
指定默认字符集 |
|
--defaults-extra-file |
除了通常的选项文件外,还要读取指定的选项文件 |
|
--defaults-file |
只读指定的选项文件 |
|
--defaults-group-suffix |
选项组后缀值 |
|
--delete |
在导入文本文件之前清空表 |
|
--enable-cleartext-plugin |
启用 cleartext 身份验证插件 |
|
--fields-enclosed-by |
此选项与 LOAD DATA 的对应子句具有相同的含义 |
|
--fields-escaped-by |
此选项与 LOAD DATA 的对应子句具有相同的含义 |
|
--fields-optionally-enclosed-by |
此选项与 LOAD DATA 的对应子句具有相同的含义 |
|
--fields-terminated-by |
此选项与 LOAD DATA 的对应子句具有相同的含义 |
|
--force |
即使发生 SQL 错误,也要继续 |
|
--get-server-public-key |
从服务器请求 RSA 公钥 |
|
--help |
显示帮助信息并退出 |
|
--host |
连接到给定主机上的 MySQL 服务器 |
|
--ignore |
查看 --replace 选项的描述 |
|
--ignore-lines |
忽略数据文件的前 N 行 |
|
--lines-terminated-by |
此选项与 LOAD DATA 的对应子句具有相同的含义 |
|
--local |
从客户机主机本地读取输入文件 |
|
--lock-tables |
在处理任何文本文件之前,锁定所有用于编写的表 |
|
--login-path |
从 .mylogin.cnf 中读取登录路径选项 |
|
--low-priority |
加载表时使用 LOW_PRIORITY 。 |
|
--no-defaults |
读取无选项文件 |
|
--password |
连接到服务器时使用的密码 |
|
--pipe |
在 Windows 上,使用命名管道连接到服务器 |
|
--plugin-dir |
安装插件的目录 |
|
--port |
用于连接的 TCP/IP 端口号 |
|
--print-defaults |
打印默认选项 |
|
--protocol |
使用的连接协议 |
|
--replace |
replace 和 ignore 选项控制对输入行的处理,这些输入行在惟一键值上复制现有行 |
|
--secure-auth |
不发送密码到服务器 (pre - 4.1) 格式, 5.7.5 后弃用 |
|
--server-public-key-path |
包含 RSA 公钥的文件的路径名 |
|
--shared-memory-base-name |
用于共享内存连接的共享内存的名称 |
|
--silent |
只在发生错误时才产生输出 |
|
--socket |
要连接到本地主机,请使用 Unix 套接字文件 |
|
--ssl |
启用加密连接 |
|
--ssl-ca |
包含受信任 SSL 证书颁发机构列表的文件 |
|
--ssl-capath |
包含可信 SSL 证书颁发机构证书文件的目录 |
|
--ssl-cert |
包含 X.509 证书的文件 |
|
--ssl-cipher |
连接加密的允许密码列表 |
|
--ssl-crl |
包含证书撤销列表的文件 |
|
--ssl-crlpath |
包含证书撤销列表文件的目录 |
|
--ssl-key |
包含 X.509 键的文件 |
|
--ssl-mode |
连接到服务器的安全状态 |
|
--ssl-verify-server-cert |
根据服务器证书公共名称标识验证主机名 |
|
--tls-version |
允许加密连接的协议 |
|
--use-threads |
用于并行文件加载的线程数 |
|
--user |
连接到服务器时使用的 MySQL 用户名 |
|
--verbose |
详细模式 |
|
--version |
显示版本信息并退出 |
详细解释见https://dev.mysql.com/doc/refman/5.7/en/mysqlimport.html
2) mysqlimport 用法示例
shell> mysql -e 'CREATE TABLE imptest(id INT, n VARCHAR(30))' test
shell> ed
a
100 Max Sydow
101 Count Dracula
.
w imptest.txt
32
q
shell> od -c imptest.txt
0000000 1 0 0 \t M a x S y d o w \n 1 0
0000020 1 \t C o u n t D r a c u l a \n
0000040
shell> mysqlimport --local test imptest.txt
test.imptest: Records: 2 Deleted: 0 Skipped: 0 Warnings: 0
shell> mysql -e 'SELECT * FROM imptest' test
+------+---------------+
| id | n |
+------+---------------+
| 100 | Max Sydow |
| 101 | Count Dracula |
+------+---------------+
