MySQL Shell(可以用来管理mgr集群)
MySQL Shell 是 MySQL Server 的高级客户端和代码编辑器。除了提供的类似于 MySQL 的 SQL 功能外,MySQL Shell 还提供JavaScript 和 Python 脚本功能,并包括与 MySQL 一起使用的 API。
(可以用来管理mgr集群)
可以用mysqlShell来搭建mgr集群或接管现有集群。
1、管理mgr集群: dba*
2、导入导出备份恢复工具 util*
---------------------------------------------
1、管理mgr集群:
常用命令:
进入mysqlshell命令:
mysqlsh
#部署沙箱环境:
dba.deploySandboxInstance(3307);
#连接实例
\c localhost:3307
#检查实例配置,若满足,则返回OK,否则修复配置项
dba.checkInstanceConfiguration();
#创建集群,先配置一个实例在集群中使用
dba.configureInstance('localhost:3307');
#创建集群mgr
var cluster=dba.createCluster('testMGR');
#添加成员
cluster.addInstance('localhost:3308');
当新节点加入集群时,如果有缺失的事务,需要经过一段时间的数据恢复后才会变成在线状态,这个恢复过程可能会持续很长。MGR会根据新加入节点的状态选择增量恢复(增量恢复只提取基于GTID的丢失数据),或者是使用克隆恢复(执行物理快照,替换新服务器的全部数据)。管理员也可以主动选择哪种方式进行恢复。
克隆插件Clone Plugin是MySQL8.0.17推出的新功能,使用它可以快速创建新节点,恢复数据并加入集群。
#查看集群状态(extended 扩展,可以查看更多信息)
cluster.status();
cluster.status({extended:1}) #这个可以查看更多信息,比如memberId
cluster.status({extended:2}) #连接和回放处理的事务
cluster.status({extended:3}) #有关每个集群成员的复制机制的详细统计信息
#查看集群配置(集群全局配置和每个集群成员的设置)
cluster.options()
#定义变量获取已有得集群(需要先连接一个实例)
var cluster=dba.getCluster();#接管现有集群:(加上:adoptFromGr:true)
var cluster=dba.createCluster('MGR1', {adoptFromGr:true});
#变成多主模式(版本低不行,测过8.0.20可以,8.0.12不行)
mysqlsh-js> cluster.switchToMultiPrimaryMode()
#变成单主模式(版本低不行,测过8.0.20可以,8.0.12不行)
mysqlsh-js> cluster.switchToSinglePrimaryMode()
#单主下实时更改主节点。(版本低不行,测过8.0.20可以,8.0.12不行)
cluster.setPrimaryInstance('172.72.0.18:3306');
2、通用命令
通用命令
命令 | 别名/快捷方式 | 描述 |
\help | \h or ? | 打印有关MySQL Shell的帮助,或搜索联机帮助。 |
\quit | \q or \exit | 退出MySQL Shell |
\ | 在SQL模式下,开始多行模式。输入空行时缓存并执行代码 | |
\status | \s | 显示当前的MySQL Shell状态 |
\js | 将执行模式切换为JavaScript | |
\py | 将执行模式切换为Python | |
\sql | 将执行模式切换为SQL | |
\connect | \c | 连接到MySQL服务器 |
\reconnect | 重新连接到同一个MySQL服务器 | |
\use | \u | 指定要使用的架构 |
\source | . | 使用活动语言执行脚本文件 |
\warnings | \W | 显示语句生成的任何警告 |
\nowarnings | \w | 不要显示语句生成的任何警告 |
\history | 查看和编辑命令行历史记录 | |
\rehash | 手动更新自动完成名称缓存 | |
\option | 查询和更改MySQL Shell配置选项 | |
\show | 使用提供的选项和参数运行指定的报告 | |
\watch | 使用提供的选项和参数运行指定的报告,并定期刷新结果 |
3、导入导出备份恢复工具:(速度很快)
util.dumpInstance( outputUrl[, options]):备份整个数据库实例,包括用户
如:util.dumpInstance('/data/backup/full')
util.dumpSchemas(schemas, outputUrl[, options]):备份指定数据库 schema
如:util.dumpSchemas(['sbtest'],'/data/backup/schema')
util.dumpTables(schema, tables, outputUrl[, options]):备份指定的表或视图
如:util.dumpTables('sbtest',['sbtest1'],'/data/backup/table')
util.loadDump(url[, options]):恢复备份
如:util.loadDump("/data/backup/full",{loadUsers: true})
util.exportTable("sbtest.sbtest1","/data/sbtest1.txt")
util.importTable("/data/sbtest1.txt", {
"characterSet": "utf8mb4",
"schema": "sbtest",
"table": "sbtest1",
"characterSet": "utf8mb4",
"threads": "8",
"showProgress": "True"
})
3.1)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:数据文件。我们看看数据文件的内容。
[root@obce02 full]# head -2 sbtest@sbtest7@@0.tsv
2 50236 54884542105-84383890734-17031208376-53198042480-37579957716-29925714417-85517113384-25376756581-77718367976-63949441208 89476502412-76889040555-50940691405-99845916108-40084696510
6 49845 70990623621-60209345888-02390212267-43027718627-09001039084-17747971746-37086612910-51831988534-95106108657-61790828473 17130038918-61986188205-04791535695-98495079462-00080118853
TSV 格式,每一行储存一条记录,字段与字段之间用制表符(\t)分隔。
- sbtest@sbtest1.json:记录了表相关的一些元数据信息,如列名,字段之间的分隔符(fieldsTerminatedBy)等。
- sbtest@sbtest1.sql:sbtest.sbtest1 的建表语句。
- sbtest.sql:建库语句。如果这个库中存在存储过程、函数、定时器,也是写到这个文件中。
- @.users.sql:创建账号及授权语句。默认不会备份 mysql.session,mysql.infoschema,mysql.sys 这三个内部账号。
3.2)util.dumpSchemas(schemas, outputUrl[, options]):备份指定数据库 schema
用法同 util.dumpInstance 类似。其中,第一个参数必须为数组,即使只需备份一个库,如,
util.dumpSchemas(['sbtest'],'/data/backup/schema')
MySQL 192.168.1.68:33066 ssl sbtest JS > util.dumpSchemas(['sbtest'],'/data/backup/schema')util.dumpSchemas(['sbtest'],'/data/backup/schema')
Acquiring global read lock
Global read lock acquired
Initializing - done
1 schemas will be dumped and within them 15 tables, 0 views.
Gathering information - done
All transactions have been started
Locking instance for backup
Global read lock has been released
Writing global DDL files
Running data dump using 4 threads.
NOTE: Progress information uses estimated values and may not be accurate.
Writing schema metadata - done
Writing DDL - done
Writing table metadata - done
Starting data dump
102% (1.52M rows / ~1.48M rows), 398.83K rows/s, 77.96 MB/s uncompressed, 35.56 MB/s compressed
Dump duration: 00:00:03s
Total duration: 00:00:04s
Schemas dumped: 1
Tables dumped: 15
Uncompressed data size: 292.72 MB
Compressed data size: 133.40 MB
Compression ratio: 2.2
Rows written: 1518919
Bytes written: 133.40 MB
Average uncompressed throughput: 75.11 MB/s
Average compressed throughput: 34.23 MB/s
速度很快。75M/S。
3.3)util.dumpTables(schema, tables, outputUrl[, options])
备份指定表的数据。 用法同 util.dumpInstance 类似。其中,第二个参数必须为数组,如,
util.dumpTables('sbtest',['sbtest1'],'/data/backup/table')
MySQL 192.168.1.68:33066 ssl sbtest JS > util.dumpTables('sbtest',['sbtest1'],'/data/backup/table')util.dumpTables('sbtest',['sbtest1'],'/data/backup/table')
Acquiring global read lock
Global read lock acquired
Initializing - done
1 tables and 0 views will be dumped.
Gathering information - done
All transactions have been started
Locking instance for backup
Global read lock has been released
Writing global DDL files
Running data dump using 4 threads.
NOTE: Progress information uses estimated values and may not be accurate.
Writing schema metadata - done
Writing DDL - done
Writing table metadata - done
Starting data dump
102% (101.25K rows / ~98.71K rows), 0.00 rows/s, 0.00 B/s uncompressed, 0.00 B/s compressed
Dump duration: 00:00:00s
Total duration: 00:00:00s
Schemas dumped: 1
Tables dumped: 1
Uncompressed data size: 19.51 MB
Compressed data size: 8.89 MB
Compression ratio: 2.2
Rows written: 101250
Bytes written: 8.89 MB
Average uncompressed throughput: 19.51 MB/s
Average compressed throughput: 8.89 MB/s
3.4)util.loadDump(url[, options])
导入通过 dump 命令生成的备份集。如,(需要在目标服务器设置参数set global local_infile=on;)
MySQL 192.168.1.69:3306 ssl JS > util.loadDump("/data/backup/schema")util.loadDump("/data/backup/schema")
Loading DDL and Data from '/data/backup/schema' using 4 threads.
Opening dump...
Target is MySQL 8.0.12. Dump was produced from MySQL 8.0.20
Scanning metadata - done
Checking for pre-existing objects...
Executing common preamble SQL
Executing DDL - done
Executing view DDL - done
Starting data load
3 thds loading / 100% (292.72 MB / 292.72 MB), 21.26 MB/s, 12 / 15 tables done
Recreating indexes - done
Executing common postamble SQL
15 chunks (1.52M rows, 292.72 MB) for 15 tables in 1 schemas were loaded in 19 sec (avg throughput 16.47 MB/s)
0 warnings were reported during the load.
util.loadDump("/data/backup/full",{loadUsers: true})
loadUsers: true 是导入账号,默认不会导入。
MySQL 192.168.1.69:3306 ssl JS > util.loadDump("/data/backup/full")util.loadDump("/data/backup/full")
Loading DDL and Data from '/data/backup/full' using 4 threads.
Opening dump...
Target is MySQL 8.0.12. Dump was produced from MySQL 8.0.20
Scanning metadata - done
Checking for pre-existing objects...
Executing common preamble SQL
Executing DDL - done
Executing view DDL - done
Starting data load
3 thds loading \ 100% (292.72 MB / 292.72 MB), 22.37 MB/s, 25 / 28 tables done
Recreating indexes - done
Executing common postamble SQL
28 chunks (1.52M rows, 292.72 MB) for 28 tables in 3 schemas were loaded in 13 sec (avg throughput 23.86 MB/s)
0 warnings were reported during the load.
#导入前会检查已经存在的对象和导入的对象有没有冲突。有冲突报错退出。
MySQL 192.168.1.69:3306 ssl JS > util.loadDump("/data/backup/full")util.loadDump("/data/backup/full")
Loading DDL and Data from '/data/backup/full' using 4 threads.
Opening dump...
Target is MySQL 8.0.12. Dump was produced from MySQL 8.0.20
Scanning metadata - done
Checking for pre-existing objects...
ERROR: Schema `lzj` already contains a table named t1
ERROR: Schema `lzj` already contains a table named t2
ERROR: Schema `lzj` already contains a table named t3
ERROR: Schema `lzj` already contains a table named t4
ERROR: Schema `mysql_innodb_cluster_metadata` already contains a table named async_cluster_members
。。。。。。
ERROR: Schema `mysql_innodb_cluster_metadata` already contains a procedure named _v2_begin_cs_change
ERROR: One or more objects in the dump already exist in the destination database. You must either DROP these objects or exclude them from the load.
Util.loadDump: While 'Scanning metadata': Duplicate objects found in destination database (MYSQLSH 53021)
MySQL 192.168.1.69:3306 ssl JS > util.loadDump("/data/backup/table")util.loadDump("/data/backup/table")
Loading DDL and Data from '/data/backup/table' using 4 threads.
Opening dump...
Target is MySQL 8.0.12. Dump was produced from MySQL 8.0.20
Scanning metadata - done
Checking for pre-existing objects...
ERROR: Schema `sbtest` already contains a table named sbtest1
ERROR: One or more objects in the dump already exist in the destination database. You must either DROP these objects or exclude them from the load.
Util.loadDump: While 'Scanning metadata': Duplicate objects found in destination database (MYSQLSH 53021)
导入完成后会生成一个Load开头的文件:
3.5)util.exportTable("sbtest.sbtest1","/data/sbtest1.txt")
导出的表可以被util.importTable 导入。将指定的表导出到文本文件中。只支持单表,效果同SELECT INTO OUTFILE 一样。
MySQL 192.168.1.69:3306 ssl JS > util.exportTable("sbtest.sbtest1","/data/sbtest1.txt")util.exportTable("sbtest.sbtest1","/data/sbtest1.txt")
Initializing - done
Gathering information - done
Running data dump using 1 thread.
NOTE: Progress information uses estimated values and may not be accurate.
Starting data dump
101% (101.25K rows / ~99.94K rows), 0.00 rows/s, 0.00 B/s
Dump duration: 00:00:00s
Total duration: 00:00:00s
Data size: 1.08 MB
Rows written: 101250
Bytes written: 1.08 MB
Average throughput: 1.08 MB/s
The dump can be loaded using:
util.importTable("/data/sbtest1.txt", {
"characterSet": "utf8mb4",
"schema": "sbtest",
"table": "sbtest1"
})
3.6)util.import_table(比load data单线程性能好不少)
将指定文本的数据导入到表中,支持多个文件。在线上,如果我们有个大文件需要导入,建议使用这个工具。它会将单个文件进行拆分,然后多线程并行执行 LOAD DATA LOCAL INFILE 操作。不仅提升了导入速度,还规避了大事务的问题。
util.importTable("/data/sbtest1.txt", {
"characterSet": "utf8mb4",
"schema": "sbtest",
"table": "sbtest1",
"characterSet": "utf8mb4",
"threads": "8",
"showProgress": "True"
})
MySQL 192.168.1.69:3306 ssl JS > util.importTable("/data/sbtest1.txt", { util.importTable("/data/sbtest1.txt", {
-> "characterSet": "utf8mb4", "characterSet": "utf8mb4",
-> "schema": "sbtest", "schema": "sbtest",
-> "table": "sbtest1", "table": "sbtest1",
-> "characterSet": "utf8mb4", "characterSet": "utf8mb4",
-> "threads": "8", "threads": "8",
-> "showProgress": "True" "showProgress": "True"
-> })})
->
Importing from file '/data/sbtest1.txt' to table `sbtest`.`sbtest1` in MySQL Server at 192.168.1.69:3306 using 1 thread
[Worker000] sbtest1.txt: Records: 101250 Deleted: 0 Skipped: 0 Warnings: 0
100% (19.51 MB / 19.51 MB), 7.80 MB/s
File '/data/sbtest1.txt' (19.51 MB) was imported in 2.5927 sec at 7.53 MB/s
Total rows affected in sbtest.sbtest1: Records: 101250 Deleted: 0 Skipped: 0 Warnings: 0
util.importJson:将 JSON 格式的数据导入到 MySQL 中,譬如将 MongoDB 中通过 mongoexport 导出的数据导入到 MySQL 中。
util.dumpInstance 详细介绍
关键特性
util.dumpInstance 的关键特性如下:
- 多线程备份。并发线程数由 threads 决定,默认是 4。
- 支持单表 chunk 级别的并行备份,前提是表上存在主键或唯一索引。
- 默认是压缩备份。
- 支持备份限速。可通过 maxRate 限制单个线程的数据读取速率。
util.dumpInstance 的备份流程与 mysqldump 大致相同,不同的地方主要体现在以下两点:
- util.dumpInstance 会加备份锁。备份锁可用来阻塞备份过程中的 DDL。
- util.dumpInstance 是并行备份,相对于 mysqldump 的单线程备份,备份效率更高。
参数解析
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.loadDump
关键特性
util.loadDump 的关键特性如下:
- 多线程恢复。并发线程数由 threads 决定,默认是 4。
- 支持断点续传功能。
- 在导入的过程中,会在备份目录生成一个进度文件,用于记录导入过程中的进度信息。 文件名由 progressFile 指定,默认是 load-progress…progress。
- 导入时,如果备份目录中存在 progressFile,默认会从上次完成的地方继续执行。如果要从头开始执行,需将 resetProgress 设置为 true。
- 支持延迟创建二级索引。
- 支持边备份,边导入。
- 通过 LOAD DATA LOCAL INFILE 命令来导入数据。
- 如果单个文件过大,util.loadDump 在导入时会自动进行切割,以避免产生大事务。
参数解析
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 等待一段时间,单位秒。
MySQL Shell Dump & Load 的注意事项
- 表上存在主键或唯一索引才能进行 chunk 级别的并行备份。字段的数据类型不限。不像 mydumper,分片键只能是整数类型。
- 对于不能进行并行备份的表,目前会备份到一个文件中。如果该文件过大,不用担心大事务的问题,util.loadDump 在导入时会自动进行切割。
- util.dumpInstance 只能保证 InnoDB 表的备份一致性。
- 默认不会备份 information_schema,mysql,ndbinfo,performance_schema,sys。
- 备份实例支持 MySQL 5.6 及以上版本,导入实例支持 MySQL 5.7 及以上版本。
- 备份的过程中,会将 BLOB 等非文本安全的列转换为 Base64,由此会导致转换后的数据大小超过原数据。
- 导入时,注意 max_allowed_packet 的限制。 导入之前,需将目标实例的 local_infile 设置为 ON。
- 该工具属于客户端工具,生成的文件在客户端。
- 导出的时候,导出路径下不能有文件。
提高恢复的速度
很多时候提高逻辑备份的恢复速度采用的方法和提高MySQL实例的联机交易速度的方法一样。例如增加 InnoDB Buffer 的大小,增加 logfile 的大小。
禁用日志
禁用日志可以减少导入过程中的 IO,从而提高导入的速度,这里的禁用日志包括二进制日志、联机日志和 InnoDB 的 Double write。
1、禁用二进制日志
MySQL 8.0 二进制日志默认是激活的,但导出的文件通常有下面的语句禁用在导入过程中记录二进制日志。
SET @@SESSION.SQL_LOG_BIN=0;
如果导出的文件没有这样的语句,可以在实例启动时增加 –skip-log-bin 或 –disable-log-bin 参数来禁止二进制日志
如果使用 source 执行加载的 SQL 语句,可以在执行之前禁用二进制日志,执行完成后打开二进制日志,例如:
mysql> set SQL_LOG_BIN=0;
mysql> source backup.sql;
mysql> set SQL_LOG_BIN=1;
2、禁用 InnoDB 的 Double Write
InnoDB 的 Double Write 机制是为了保证 InnoDB 的原子写二产生的,在数据导入过程中,为了提高效率,可以禁用 InnoDB 的 Double Write。通过设置系统参数 innodb_doublewrite 为 off 禁用 InnoDB 的 Double Write,如下所示:
mysql > set persist_only innodb_doublewrite = off;
系统参数 innodb_doublewrite 是静态参数,设置完成后需要重新启动 MySQL 实例,也可以在启动 MySQL 实例时使用参数 --skip-innodb-doublewrite 禁用 InnoDB 的 Double Write。注意,数据导入完成后要取消该设置。
3、禁用联机日志
在 MySQL 8.0.21 中新增了禁用联机日志的功能,同时会禁用 InnoDB 的 Double Write。禁用联机日志是实例级,不支持表级。启动这项功能的命令如下:
mysql>alter instance disable redo_log;
可以使用状态参数 Innodb_redo_log_enabled 检查联机日志的使用情况,相应 SQL 语句及运行结果如下:
mysql> show global status like 'Innodb_redo_log_enabled';
重新激活联机日志的命令如下:
mysql> alter instance enable innodb redo_log;
禁用联机日志时可以正常地关闭和重启实例,但在异常宕机的情况下,可能会导致数据丢失或页面损坏,禁用联机日志时,异常宕机的实例可能需要废弃重建。
对应压缩的备份集,不要再完成解压后再进行加载,应该在单个操作中同时完成解压和加载,这样会快很多:
$gzip -d back.sql.gz|mysql
总结一下:
•InnoDB Cluster 是MySQL内置的高可用解决方案
•MySQL Clone插件将InnoDBCluster的可用性提升到了一个全新的高度!InnoDBCluster功能内置了对完整实例配置的支持
•MySQLShell是开发人员和DBA的统一接口以及InnoDB Cluster的前端管理软件