mysqlShell常用汇总(管理mgr集群、备份恢复、导入导出)

 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 的关键特性如下:

  1. 多线程备份。并发线程数由 threads 决定,默认是 4。
  2. 支持单表 chunk 级别的并行备份,前提是表上存在主键或唯一索引。
  3. 默认是压缩备份。
  4. 支持备份限速。可通过 maxRate 限制单个线程的数据读取速率。

util.dumpInstance 的备份流程与 mysqldump 大致相同,不同的地方主要体现在以下两点:

  1. util.dumpInstance 会加备份锁。备份锁可用来阻塞备份过程中的 DDL。
  2. 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 的关键特性如下:

  1. 多线程恢复。并发线程数由 threads 决定,默认是 4。
  2. 支持断点续传功能。
    • 在导入的过程中,会在备份目录生成一个进度文件,用于记录导入过程中的进度信息。 文件名由 progressFile 指定,默认是 load-progress…progress。
    • 导入时,如果备份目录中存在 progressFile,默认会从上次完成的地方继续执行。如果要从头开始执行,需将 resetProgress 设置为 true。
  3. 支持延迟创建二级索引。
  4. 支持边备份,边导入。
  5. 通过 LOAD DATA LOCAL INFILE 命令来导入数据。
  6. 如果单个文件过大,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 的注意事项

  1. 表上存在主键或唯一索引才能进行 chunk 级别的并行备份。字段的数据类型不限。不像 mydumper,分片键只能是整数类型。
  2. 对于不能进行并行备份的表,目前会备份到一个文件中。如果该文件过大,不用担心大事务的问题,util.loadDump 在导入时会自动进行切割。
  3. util.dumpInstance 只能保证 InnoDB 表的备份一致性。
  4. 默认不会备份 information_schema,mysql,ndbinfo,performance_schema,sys。
  5. 备份实例支持 MySQL 5.6 及以上版本,导入实例支持 MySQL 5.7 及以上版本。
  6. 备份的过程中,会将 BLOB 等非文本安全的列转换为 Base64,由此会导致转换后的数据大小超过原数据。
  7. 导入时,注意 max_allowed_packet 的限制。 导入之前,需将目标实例的 local_infile 设置为 ON。
  8. 该工具属于客户端工具,生成的文件在客户端。
  9. 导出的时候,导出路径下不能有文件。

 

提高恢复的速度

很多时候提高逻辑备份的恢复速度采用的方法和提高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的前端管理软件

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在MySQL 8中,可以使用MySQL Shell管理MySQL Group Replication (mgr)。要重启mgr,请按照以下步骤进行操作: 1.首先,使用MySQL Shell连接到mgr: ```shell mysqlsh node1:3306,node2:3306,node3:3306 ``` 其中,node1、node2和node3是mgr的三个节点的主机名或IP地址,3306是MySQL服务器端口号。 2.检查mgr状态: ```shell mysql-js> var gr = shell.getGroup() mysql-js> gr.status() ``` 3.如果需要重启mgr,请执行以下操作: ```shell mysql-js> gr.stop() mysql-js> gr.start() ``` 这将停止mgr并重新启动它。请注意,在重新启动mgr之前,必须确保所有节点都已启动并处于运行状态。 4.检查mgr状态以确保它已成功重启: ```shell mysql-js> gr.status() ``` 如果mgr状态显示为“ ONLINE”,则表示mgr已成功重启。 ### 回答2: 要重启 MySQL 8 ShellMGR (MySQL Group Replication),您可以按照以下步骤进行操作: 1. 打开 MySQL 8 Shell。可以通过运行命令 `mysqlsh` 来启动 MySQL 8 Shell。 2. 连接到 MGR 的主节点。运行以下命令连接到 MGR 主节点: ```shell \connect username@hostname:port ``` 其中,`username` 是您的 MySQL 用户名,`hostname` 是主节点的主机名或 IP 地址,`port` 是主节点的端口号。 3. 检查 MGR 状态。运行以下命令检查 MGR 的状态: ```shell \sql SELECT * FROM performance_schema.replication_group_members; ``` 这将显示 MGR 中所有成员的状态。确保主节点正常运行,并记录下所有成员的 UUID。 4. 关闭其他成员。为了安全地重启 MGR,您需要先关闭除主节点外的所有成员。使用以下命令关闭其他成员: ```shell \sql STOP GROUP_REPLICATION; ``` 5. 重启主节点。运行以下命令重启主节点: ```shell \sql START GROUP_REPLICATION; ``` 6. 检查 MGR 状态。再次运行第 3 步中的命令,确保所有成员都已重新启动并正常运行。 以上就是使用 MySQL 8 Shell 重启 MGR 的步骤。请确保在执行这些操作之前备份数据库以防止数据丢失。 ### 回答3: 要重启MySQL 8的shell MGR,可以按照以下步骤进行操作: 1. 连接到MySQL Shell:在终端或命令提示符窗口中输入`mysqlsh`命令并按回车键,以启动MySQL Shell。 2. 连接到MGR集群:在MySQL Shell中输入以下命令连接到MGR集群: ``` \connect user@localhost:port ``` 其中,`user`是MGR集群连接的用户名,`localhost`是MGR集群所在的主机地址,`port`是MGR集群连接的端口号。 3. 查看MGR状态:在MySQL Shell中输入以下命令查看当前MGR集群的状态: ``` \status ``` 这将显示出当前各个成员的状态以及其他相关信息。 4. 切换到主节点:在MySQL Shell中输入以下命令切换到MGR集群的主节点: ``` \connect primary ``` 这将切换到当前MGR集群的主节点。 5. 执行重启操作:在主节点MySQL Shell中输入以下命令执行重启操作: ``` STOP GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_group=ON; START GROUP_REPLICATION; ``` 这将停止MGR集群的复制,启用启动引导,然后重新启动MGR集群。 6. 确认重启完成:在MySQL Shell中输入以下命令确认MGR集群已成功重启: ``` \status ``` 确保所有节点都处于运行状态,并且集群复制已恢复正常。 请注意,执行上述操作需要具有适当的权限。同时,重启MGR集群可能会中断正在进行的数据库操作,因此请在合适的时间进行操作,并确保已进行适当的备份工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值