基本安装
MySQL-Shell下载地址:
https://dev.mysql.com/downloads/shell/
还是选择Linux 二进制版本( Linux - Generic ),glibc选2.17,如果选2.28还需要升级,非常麻烦。
解压后,配置完环境变量。
之后进入MySQL-Shell:
mysqlsh -uroot -p
切换到sql:
\sql
退出命令行:
\q
备份实例
util.dumpInstance(outputUrl[, options])
备份实例。
其中,outputUrl 是备份目录,此目录必须为空。options 是可指定的选项。
示例:
util.dumpInstance('/data/backup/full',{compression: "none"})
命令中的 /data/backup/full 是备份目录,compression: “none” 指的是不压缩。
这里设置为不压缩主要是为了方便查看数据文件的内容。线上使用建议开启压缩,默认即开启。
压缩开启后文件中会多一些不可读的内容。
备份结果
备份结果中文件说明:
- @.done.json:会记录备份的结束时间,备份集的大小。备份结束时生成。
- @.json:会记录备份的一些元数据信息,包括备份时的一致性位置点信息:binlogFile,binlogPosition 和 gtidExecuted,这些信息可用来建立复制。
- @.sql,@.post.sql:这两个文件只有一些注释信息。不过在通过 util.loadDump 导入数据时,我们可以通过这两个文件自定义一些 SQL。其中,@.sql 是数据导入前执行,@.post.sql 是数据导入后执行。
- sbtest.json:记录 sbtest 中已经备份的表、视图、定时器、函数和存储过程。*.tsv:数据文件。我们看看数据文件的内容。TSV 格式,每一行储存一条记录,字段与字段之间用制表符(\t)分隔。
- *.tsv:数据文件。我们看看数据文件的内容。TSV 格式,每一行储存一条记录,字段与字段之间用制表符(\t)分隔。
- sbtest@sbtest1.json:记录了表相关的一些元数据信息,如列名,字段之间的分隔符(fieldsTerminatedBy)等。
- sbtest@sbtest1.sql:sbtest.sbtest1 的建表语句。
- sbtest.sql:建库语句。如果这个库中存在存储过程、函数、定时器,也是写到这个文件中。
- @.users.sql:创建账号及授权语句。默认不会备份 mysql.session,mysql.session,mysql.sys 这三个内部账号。
备份参数
util.dumpInstance 的参数可分为如下几类:
过滤相关
以下是过滤相关的选项:
- excludeSchemas:忽略某些库的备份,多个库之间用逗号隔开,如,
- excludeSchemas: [“db1”, “db2”]includeSchemas:指定某些库的备份。excludeTables:忽略某些表的备份,表必须是 schema.table 的格式,多个表之间用逗号隔开,如,
- excludeTables: [“sbtest.sbtest1”, “sbtest.sbtest2”]includeTables:指定某些表的备份。
- events:是否备份定时器,默认为 true。
- excludeEvents:忽略某些定时器的备份。
- includeEvents:指定某些定时器的备份。
- routines:是否备份函数和存储过程,默认为 true。
- excludeRoutines:忽略某些函数和存储过程的备份。
- includeRoutines:指定某些函数和存储过程的备份。
- users:是否备份账号信息,默认为 true。
- excludeUsers:忽略某些账号的备份,可指定多个账号。
- includeUsers:指定某些账号的备份,可指定多个账号。
- triggers:是否备份触发器,默认为 true。
- excludeTriggers:忽略某些触发器的备份。
- includeTriggers:指定某些触发器的备份。
- ddlOnly:是否只备份表结构,默认为 false。
- dataOnly:是否只备份数据,默认为 false。
并行备份相关
- chunking:是否开启 chunk 级别的并行备份功能,默认为 true。bytesPerChunk:每个 chunk 文件的大小,默认 64M。
- threads:并发线程数,默认为 4。
OCI(甲骨文云)相关
- ocimds:是否检查备份集与 MySQL Database Service(甲骨文云的 MySQL 云服务,简称 MDS )的兼容性,默认为 false,不检查。如果设置为 true,会输出所有的不兼容项及解决方法。不兼容项可通过下面的 compatibility 来解决。compatibility:如果要将备份数据导入到 MDS 中,为了保证与后者的兼容性,可在导出的过程中进行相应地调整。具体来说:
- create_invisible_pks:对于没有主键的表,会创建一个隐藏主键:my_row_id BIGINT UNSIGNED AUTO_INCREMENT INVISIBLE PRIMARY KEY。隐藏列是 MySQL 8.0.23 引入的。force_innodb:将表的引擎强制设置为 InnoDB。
- ignore_missing_pks:忽略主键缺失导致的错误,与 create_invisible_pks 互斥,不能同时指定。
- skip_invalid_accounts:忽略没有密码,或者使用了 MDS 不支持的认证插件的账号。
- strip_definers:去掉视图、存储过程、函数、定时器、触发器中的 DEFINER=account 子句。
- strip_restricted_grants:去掉 MDS 中不允许 GRANT 的权限。
- strip_tablespaces:去掉建表语句中的 TABLESPACE=xxx 子句。
osBucketName,osNamespace,ociConfigFile,ociProfile,ociParManifest,ociParExpireTime:OCI 对象存储相关。
其它选项
- tzUtc:是否设置 TIME_ZONE = ‘+00:00’,默认为 true。
- consistent:是否开启一致性备份,默认为 true。若设置为 false,则不会加全局读锁,也不会开启事务的一致性快照。
- dryRun:试运行。此时只会打印备份信息,不会执行备份操作。
- maxRate:限制单个线程的数据读取速率,单位 byte,默认为 0,不限制。
- showProgress:是否打印进度信息,如果是 TTY 设备(命令行终端),则为 true,反之,则为 false。
- defaultCharacterSet:字符集,默认为 utf8mb4。
- compression:备份文件的压缩算法,默认为 zstd。也可设置为 gzip 或 none(不压缩)。
#其他粒度备份
util.dumpSchemas(schemas, outputUrl[, options])
备份指定库的数据。
用法同 util.dumpInstance 类似。其中,第一个参数必须为数组,即使只需备份一个库,如:
util.dumpSchemas(['sbtest'],'/data/backup/schema')
支持的配置大部分与 util.dumpInstance 相同。
从 MySQL Shell 8.0.28 开始,可直接使用 util.dumpInstance 中的 includeSchemas 选项进行指定库的备份。
util.dumpTables(schema, tables, outputUrl[, options])
备份指定表的数据。
用法同 util.dumpInstance 类似。其中,第二个参数必须为数组,如:
util.dumpTables('sbtest',['sbtest1'],'/data/backup/table')
支持的配置大部分与 util.dumpInstance 相同。
从 MySQL Shell 8.0.28 开始,可直接使用 util.dumpInstance 中的 includeTables 选项进行指定表的备份。
结合crontab进行定时备份
1.创建备份语句脚本
创建 /backup/scripts/mysql_shell_dumpInstance.sql
util.dumpInstance('/backup/mysql_instance',{excludeSchemas:["mysql","sys","information_schema","performance_schema"]})
2.创建调用脚本
创建/backup/scripts/mysql_shell_dumpInstance.sh
mv /backup/mysql_instance /backup/mysql_instance_`date +%Y%m%d -d"yesterday"`
mkdir /backup/mysql_instance
dbuser=root
savedays=3
/app/mysql-shell/bin/mysqlsh -uroot > /backup/mysql_instance/backup.log
fi
find /backup/ -name "mysql_instance*" -type d -mtime +${savedays} -exec rm -rf {} \;
注:
(1)调用前需保证存在/backup/mysql_instance备份目录,否则要先手动创建。
(2)用户密码可以保存至mysql-shell中,就不用显示指定了。
3.crontab定时调用
crontab -e
30 0 * * * /bin/bash /backup/scripts/mysql_shell_dumpInstance.sh > /dev/null 2>&1
备份流程
-
1.连接初始化
SET SQL_MODE = ‘’
SET NAMES ‘utf8mb4’
SET SESSION net_write_timeout = 1800
SET SESSION wait_timeout = 31536000
SET TIME_ZONE = ‘+00:00’
-
2.加全局读锁
FLUSH NO_WRITE_TO_BINLOG TABLES
FLUSH TABLES WITH READ LOCK
-
3.设置会话隔离级别为RR2,开启事务一致性快照
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
START TRANSACTION WITH CONSISTENT SNAPSHOT
-
4.获取GTID_EXECUTED
SELECT @@GLOBAL.GTID_EXECUTED
-
5.采集信息
采集信息包括要备份的库,表,视图,账号,定时器,存储过程,函数和触发器
-
6.获取binlog位置点信息
SHOW MASTER STATUS
-
7.加备份锁,阻塞DDL
LOCK INSTANCE FOR BACKUP
-
8.释放全局读锁
UNLOCK TABLES
-
9.备份账号权限
SHOW CREATE USER ‘user’@‘host’
SHOW GRANT FOR ‘user’@‘host’
-
10.按照库级别备份库表结构,视图,定时器,存储过程,函数和触发器
-
11.备份表数据
-
12.备份结束
还原实例
1.连接初始化
SET SQL_MODE = ‘’
SET NAMES ‘utf8mb4’
SET SESSION net_write_timeout = 1800
SET SESSION wait_timeout = 31536000
SET TIME_ZONE = ‘+00:00’
2.加全局读锁
FLUSH NO_WRITE_TO_BINLOG TABLES
FLUSH TABLES WITH READ LOCK
3.设置会话隔离级别为RR2,开启事务一致性快照
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
START TRANSACTION WITH CONSISTENT SNAPSHOT
4.获取GTID_EXECUTED
SELECT @@GLOBAL.GTID_EXECUTED
5.采集信息
采集信息包括要备份的库,表,视图,账号,定时器,存储过程,函数和触发器
6.获取binlog位置点信息
SHOW MASTER STATUS
7.加备份锁,阻塞DDL
LOCK INSTANCE FOR BACKUP
8.释放全局读锁
UNLOCK TABLES
9.备份账号权限
SHOW CREATE USER ‘user’@‘host’
SHOW GRANT FOR ‘user’@‘host’
10.按照库级别备份库表结构,视图,定时器,存储过程,函数和触发器
11.备份表数据
12.备份结束
util.loadDump(url[, options])
导入通过 dump 命令生成的备份集。
例:
util.loadDump("/data/backup/full",{loadUsers: true})
命令中的 /data/backup/full 是备份目录,loadUsers: true 是导入账号,默认不会导入。
还原参数
util.loadDump 的参数可分为如下几类:
过滤相关
- excludeEvents:忽略某些定时器的导入。
- excludeRoutines:忽略某些函数和存储过程的导入。
- excludeSchemas:忽略某些库的导入。
- excludeTables:忽略某些表的导入。
- excludeTriggers:忽略某些触发器的导入。
- excludeUsers:忽略某些账号的导入。
- includeEvents:导入指定定时器。
- includeRoutines:导入指定函数和存储过程。
- includeSchemas:导入指定库。
- includeTables:导入指定表。
- includeTriggers:导入指定触发器。
- includeUsers:导入指定账号。
- loadData:是否导入数据,默认为 true。
- loadDdl:是否导入 DDL 语句,默认为 true。
- loadUsers:是否导入账号,默认为 false。注意,即使将 loadUsers 设置为 true,也不会导入当前正在执行导入操作的用户。
- ignoreExistingObjects:是否忽略已经存在的对象,默认为 off。
并行导入相关
- backgroundThreads:获取元数据和 DDL 文件内容的线程数。备份集如果存储在本地,backgroundThreads 默认和 threads 一致。
- threads:并发线程数,默认为 4。
- maxBytesPerTransaction:指定单个 LOAD DATA 操作可加载的最大字节数。默认与 bytesPerChunk 一致。这个参数可用来规避大事务。
断点续传相关
- progressFile:在导入的过程中,会在备份目录生成一个 progressFile,用于记录加载过程中的进度信息,这个进度信息可用来实现断点续传功能。默认为 load-progress..progress。
- resetProgress:如果备份目录中存在 progressFile,默认会从上次完成的地方继续执行。如果要从头开始执行,需将 resetProgress 设置为 true。该参数默认为 off。
OCI 相关
osBucketName,osNamespace,ociConfigFile,ociProfile。
二级索引相关
- deferTableIndexes:是否延迟(数据加载完毕后)创建二级索引。可设置:off(不延迟),fulltext(只延迟创建全文索引,默认值),all(延迟创建所有索引)。
- loadIndexes:与 deferTableIndexes 一起使用,用来决定数据加载完毕后,最后的二级索引是否创建,默认为 true。
其它选项
- analyzeTables:表加载完毕后,是否执行 ANALYZE TABLE 操作。默认是 off(不执行),也可设置为 on 或 histogram(只对有直方图信息的表执行)。
- characterSet:字符集,无需显式设置,默认会从备份集中获取。
- createInvisiblePKs:是否创建隐式主键,默认从备份集中获取。这个与备份时是否指定了 create_invisible_pks 有关,若指定了则为 true,反之为 false。dryRun:试运行。
- ignoreVersion:忽略 MySQL 的版本检测。默认情况下,要求备份实例和导入实例的大版本一致。
- schema:将表导入到指定 schema 中,适用于通过 util.dumpTables 创建的备份。
- showMetadata:导入时是否打印一致性备份时的位置点信息。
- showProgress:是否打印进度信息。
- skipBinlog:是否设置 sql_log_bin=0 ,默认 false。这一点与 mysqldump、mydumper 不同,后面这两个工具默认会禁用 Binlog。updateGtidSet:更新 GTID_PURGED。可设置:off(不更新,默认值), replace(替代目标实例的 GTID_PURGED), append(追加)。
- waitDumpTimeout:util.loadDump 可导入当前正在备份的备份集。处理完所有文件后,如果备份还没有结束(具体来说,是备份集中没有生成 @.done.json),util.loadDump 会报错退出,可指定 waitDumpTimeout 等待一段时间,单位秒。