MySQL Shell

MySQL Shell是MySQL服务器的统一脚本接口。它支持JavaScript和Python脚本。JavaScript是默认的处理模式。在大多数情况下,你需要一个账户来连接到本地的MySQL服务器实例。

启动MySQL Shell
安装并启动MySQL server后,将MySQL Shell连接到server实例。默认情况下,MySQL Shell使用X协议连接。

在运行server实例的系统上,打开一个终端窗口,并使用以下命令启动MySQL Shell:

mysqlsh name@localhost/world_x
Creating a Session to 'root@localhost/world_x'
Enter password: ****

您可能需要指定适当的路径。

另外:
.name表示MySQL帐户的用户名。
.MySQL Shell提示您输入密码。
.这个会话的默认模式是world_x数据库。

mysql-js>提示符表明此会话的活动语言是JavaScript。

[root@localhost ~]# mysqlsh root@localhost/world_x
Please provide the password for 'root@localhost': ******
Save password for 'root@localhost'? [Y]es/[N]o/Ne[v]er (default No): N
MySQL Shell 8.0.41

Copyright (c) 2016, 2025, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates.
Other names may be trademarks of their respective owners.

Type '\help' or '\?' for help; '\quit' to exit.
Creating a session to 'root@localhost/world_x'
Fetching schema names for auto-completion... Press ^C to stop.
Your MySQL connection id is 61 (X protocol)
Server version: 5.7.26-log Source distribution
Default schema `world_x` accessible through db.
 MySQL  localhost:33060+  world_x  JS > 

当不带host参数运行mysqlsh时,MySQL Shell会尝试连接运行在localhost接口上的33060端口上的服务器实例。

MySQL Shell支持如下的输入行编辑:
.左箭头键和右箭头键在当前输入行内水平移动。
.向上箭头键和向下箭头键在先前输入的行集合中向上和向下移动。
.退格键删除光标之前的字符,输入新的字符将在光标位置输入。
.Enter输入当前输入行。

获取MySQL Shell的帮助
在命令解释器的提示符下输入mysqlsh –help以获取命令行选项列表。

[root@localhost ~]# mysqlsh --help
MySQL Shell 8.0.41

Copyright (c) 2016, 2025, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates.
Other names may be trademarks of their respective owners.

Usage: mysqlsh [OPTIONS] [URI]
       mysqlsh [OPTIONS] [URI] -f  [

在MySQL Shell提示符下输入\help,查看可用命令及其描述。

 MySQL  localhost:33060+  world_x  JS > \help
The Shell Help is organized in categories and topics. To get help for a
specific category or topic use: \? 

The  argument should be the name of a category or a topic.

The pattern is a filter to identify topics for which help is required, it can
use the following wildcards:

- ? matches any single character.
- * matches any character sequence.

The following are the main help categories:

 - AdminAPI       The AdminAPI is an API that enables configuring and managing
                  InnoDB Clusters, ReplicaSets, ClusterSets, among other
                  things.
 - Shell Commands Provides details about the available built-in shell commands.
 - ShellAPI       Contains information about the shell and util global objects
                  as well as the mysql module that enables executing SQL on
                  MySQL Servers.
 - SQL Syntax     Entry point to retrieve syntax help on SQL statements.
 - X DevAPI       Details the mysqlx module as well as the capabilities of the
                  X DevAPI which enable working with MySQL as a Document Store

The available topics include:

- The dba global object and the classes available at the AdminAPI.
- The mysqlx module and the classes available at the X DevAPI.
- The mysql module and the global objects and classes available at the
  ShellAPI.
- The functions and properties of the classes exposed by the APIs.
- The available shell commands.
- Any word that is part of an SQL statement.
- Command Line - invoking built-in shell functions without entering interactive
  mode.

SHELL COMMANDS

The shell commands allow executing specific operations including updating the
shell configuration.

The following shell commands are available:

 - \                   Start multi-line input when in SQL mode.
 - \connect    (\c)    Connects the shell to a MySQL server and assigns the
                       global session.
 - \disconnect         Disconnects the global session.
 - \edit       (\e)    Launch a system editor to edit a command to be executed.
 - \exit               Exits the MySQL Shell, same as \quit.
 - \help       (\?,\h) Prints help information about a specific topic.
 - \history            View and edit command line history.
 - \js                 Switches to JavaScript processing mode.
 - \nopager            Disables the current pager.
 - \nowarnings (\w)    Don't show warnings after every statement.
 - \option             Allows working with the available shell options.
 - \pager      (\P)    Sets the current pager.
 - \py                 Switches to Python processing mode.
 - \quit       (\q)    Exits the MySQL Shell.
 - \reconnect          Reconnects the global session.
 - \rehash             Refresh the autocompletion cache.
 - \show               Executes the given report with provided options and
                       arguments.
 - \source     (\.)    Loads and executes a script from a file.
 - \sql                Executes SQL statement or switches to SQL processing
                       mode when no statement is given.
 - \status     (\s)    Print information about the current global session.
 - \system     (\!)    Execute a system shell command.
 - \use        (\u)    Sets the active schema.
 - \warnings   (\W)    Show warnings after every statement.
 - \watch              Executes the given report with provided options and
                       arguments in a loop.

GLOBAL OBJECTS

The following modules and objects are ready for use when the shell starts:

 - db      Used to work with database schema objects.
 - dba     Used for InnoDB Cluster, ReplicaSet, and ClusterSet administration.
 - mysql   Support for connecting to MySQL servers using the classic MySQL
           protocol.
 - mysqlx  Used to work with X Protocol sessions using the MySQL X DevAPI.
 - os      Gives access to functions which allow to interact with the operating
           system.
 - plugins Plugin to manage MySQL Shell plugins
 - session Represents the currently open MySQL session.
 - shell   Gives access to general purpose functions and properties.
 - sys     Gives access to system specific parameters.
 - util    Global object that groups miscellaneous tools like upgrade checker
           and JSON import.

For additional information on these global objects use: .help()

EXAMPLES
\? AdminAPI
      Displays information about the AdminAPI.

\? \connect
      Displays usage details for the \connect command.

\? checkInstanceConfiguration
      Displays usage details for the dba.checkInstanceConfiguration function.

\? sql syntax
      Displays the main SQL help categories.
 MySQL  localhost:33060+  world_x  JS > 

请输入\help和命令名,获取MySQL Shell命令的详细帮助。例如,要查看\connect命令的帮助信息,输入:

 MySQL  localhost:33060+  world_x  JS > \help \connect
NAME
      \connect - Connects the shell to a MySQL server and assigns the global
      session.

SYNTAX
      \connect [] 
      \c [] 

DESCRIPTION
      TYPE is an optional parameter to specify the session type. Accepts the
      following values:

      - --mc, --mysql: create a classic MySQL protocol session (default port
        3306)
      - --mx, --mysqlx: create an X protocol session (default port 33060)
      - --ssh : create an SSH tunnel to use as a gateway for db
        connection. This requires that db port is specified in advance.

      If TYPE is omitted, automatic protocol detection is done, unless the
      protocol is given in the URI.

      URI format is: [user[:password]@]hostname[:port] and SSHURI format is:
      [user@]hostname[:port]

EXAMPLE
      \connect --mx root@localhost
            Creates a global session using the X protocol to the indicated URI.
 MySQL  localhost:33060+  world_x  JS > 

退出MySQL Shell
输入如下命令退出MySQL Shell:

 MySQL  localhost:33060+  world_x  JS > \quit

MySQL 安装Shell

安装MySQL Shell
这里将介绍如何下载、安装和启动MySQL Shell。MySQL Shell是一个交互式的JavaScript、Python或SQL接口,支持MySQL服务器的开发和管理。 MySQL Shell是一个可以单独安装的组件。

在Microsoft Windows上安装MySQL Shell
在Microsoft Windows上使用MSI Installer安装MySQL Shell,请执行以下操作:
1.从http://dev.mysql.com/downloads/ shell/下载Windows(x86, 64位),MSI安装包。
2.当出现提示时,单击Run。
3.按照安装向导中的步骤操作。

如果安装MySQL时没有启用X插件,然后决定安装X插件,或者如果安装MySQL时没有使用MySQL安装程序,请参见安装X插件。

Linux下安装MySQL Shell
对于支持的Linux发行版,在Linux上安装MySQL Shell最简单的方法是使用MySQL APT存储库或MySQL Yum存储库。对于不使用MySQL存储库的系统 ,也可以直接下载并安装MySQL Shell。

使用MySQL APT存储库安装MySQL Shell
对于MySQL APT库支持的Linux发行版,请遵循以下路径之一:
.如果你的系统还没有MySQL APT存储库作为软件存储库,请执行以下操作:

.请按照“添加MySQL APT存储库”中的步骤进行操作,需要特别注意以下事项:
.在安装配置包的过程中,当在对话框中被要求配置存储库时,请确保选择MySQL 5.7(这是默认选项)作为你想要的发行版系列,并启用MySQL Preview Packages组件。

.确保您没有跳过更新MySQL APT存储库的包信息的步骤:

sudo apt-get update

.用这个命令安装MySQL Shell:

sudo apt-get install mysql-shell

.如果你的系统上已经有MySQL APT存储库作为软件存储库,请执行以下操作:
.更新MySQL APT仓库的包信息:

sudo apt-get update

.使用以下命令更新MySQL APT存储库配置包:

 sudo apt-get install mysql-apt-config

当在对话框中被要求配置存储库时,请确保选择MySQL 5.7(这是默认选项)作为你想要的发行版系列,并启用MySQL Preview Packages组件。

.用这个命令安装MySQL Shell:
用这个命令安装MySQL Shell:

使用MySQL Yum存储库安装MySQL Shell
对于MySQL Yum支持的Linux发行版,按照以下步骤安装MySQL Shell:
.执行下列操作之一:
.如果您已经将MySQL Yum存储库作为系统上的软件存储库,并且该存储库配置了新的发布包mysql57-community-release,则跳过下一步(“启 用MySQL工具预览子存储库……”)。

.如果你已经将MySQL Yum存储库作为软件存储库安装在你的系统上,但已经配置了旧的发布包MySQL -community-release,安装MySQL Shell最 简单的方法是先用新的mysql57- community-release包重新配置MySQL Yum存储库。为此,您需要先删除旧的发行版包,使用以下命令:

 sudo yum remove mysql-community-release

对于启用了dnf的系统,可以这样做:

 sudo dnf erase mysql-community-release

然后,按照添加MySQL Yum存储库的步骤安装新的发布包mysql57-community-release。

.如果系统中还没有MySQL Yum存储库作为软件存储库,请按照添加MySQL Yum存储库的步骤操作。

.启用MySQL Tools预览子存储库。你可以手动编辑/etc/yum.repos.d/mysql-community.repo文件。这是文件中子仓库默认条目的一个例子(文 件中的baseurl条目可能看起来不同,这取决于你的Linux发行版):

[mysql-tools-preview]
name=MySQL Tools Preview
baseurl=http://repo.mysql.com/yum/mysql-tools-preview/el/6/$basearch/
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

将条目enabled=0更改为enabled=1以启用子存储库。

.用这个命令安装MySQL Shell:

sudo yum install mysql-shell

对于启用dnf的系统,可以这样做:

sudo dnf install mysql-shell

从MySQL Developer专区直接下载安装MySQL Shell
MySQL Shell的RPM、Debian和源码包也可以从download MySQL Shell下载。

MySQL 安装X插件

MySQL要安装内置的X Plugin,有以下三种方式:
.使用MySQL Windows安装程序
a.启动MySQL安装程序。MySQL安装程序仪表板打开。
b.单击MySQL Server的Reconfigure快速操作。使用“下一步”和“返回”配置以下内容:
.在“帐户和角色”中确认当前root帐户的密码。
.在“插件和扩展”中,勾选“启用X协议/MySQL作为文档存储”复选框。MySQL安装程序提供一个默认端口号,并打开防火墙端口供网络访问。
.在“应用服务器配置”中单击“执行”。
c.安装MySQL Shell。

.使用MySQL Shell
a.安装MySQL Shell

[root@localhost ~]# rpm -ivh mysql-shell-8.0.41-1.el7.x86_64.rpm

b.打开终端窗口(Windows上的命令提示符),导航到MySQL二进制文件位置(例如,Linux上的/usr/bin/)。

c.执行如下命令:

[root@localhost ~]# mysqlsh -u root -h 10.18.10.20 -P 3306 --classic --dba enableXProtocol
WARNING: The --classic option was deprecated, please use --mysql instead. (Option has been processed as --mysql).
Please provide the password for 'root@10.18.10.20:3306': ******
Save password for 'root@10.18.10.20 :3306'? [Y]es/[N]o/Ne[v]er (default No): N
enableXProtocol: Installing plugin mysqlx...
enableXProtocol: Verifying plugin is active...
enableXProtocol: successfully installed the X protocol plugin!

[root@localhost ~]# netstat -ltnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:24903           0.0.0.0:*               LISTEN      30883/mysqld
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      8407/mysqld
tcp        0      0 0.0.0.0:3307            0.0.0.0:*               LISTEN      8444/mysqld
tcp        0      0 0.0.0.0:3308            0.0.0.0:*               LISTEN      30883/mysqld
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1584/sshd
tcp        0      0 0.0.0.0:24901           0.0.0.0:*               LISTEN      8407/mysqld
tcp        0      0 0.0.0.0:24902           0.0.0.0:*               LISTEN      8444/mysqld
tcp6       0      0 :::22                   :::*                    LISTEN      1584/sshd
tcp6       0      0 :::33060                :::*                    LISTEN      8407/mysqld

33060端口就是X插件所占用的端口。
.使用MySQL客户端程序:
a.打开终端窗口(Windows上的命令提示符),导航到MySQL二进制文件位置(例如,Linux上的/usr/bin/)。

b.调用mysql命令行客户端:

[root@localhost ~]# mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 45
Server version: 5.7.26-log Source distribution

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

c.执行以下语句:

mysql> INSTALL PLUGIN mysqlx SONAME 'mysqlx.so';
Query OK, 0 rows affected (0.14 sec)

mysql>

[mysql@localhost mysql]$ netstat -ltnp
(No info could be read for "-p": geteuid()=27 but you should be root.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      -
tcp6       0      0 :::3306                 :::*                    LISTEN      -
tcp6       0      0 :::22                   :::*                    LISTEN      -
tcp6       0      0 ::1:631                 :::*                    LISTEN      -
tcp6       0      0 :::33060                :::*                    LISTEN      -

33060端口就是X插件所占用的端口。
d.安装MySQL Shell。

[root@localhost ~]# rpm -ivh mysql-shell-8.0.41-1.el7.x86_64.rpm

3.验证X Plugin是否已经安装。
当X Plugin安装正确时,当您使用以下命令之一查询服务器上的活动插件时,它会显示在列表中:
.MySQL Shell命令:

[root@localhost ~]# mysqlsh -u root -h 10.18.10.20  -P 3306 --sqlc -e "show plugins"
Please provide the password for 'root@10.18.10.20 :3306': ******
Save password for 'root@10.18.10.20 :3306'? [Y]es/[N]o/Ne[v]er (default No): N
Name    Status  Type    Library License
binlog  ACTIVE  STORAGE ENGINE  NULL    GPL
mysql_native_password   ACTIVE  AUTHENTICATION  NULL    GPL
sha256_password ACTIVE  AUTHENTICATION  NULL    GPL
CSV     ACTIVE  STORAGE ENGINE  NULL    GPL
MEMORY  ACTIVE  STORAGE ENGINE  NULL    GPL
InnoDB  ACTIVE  STORAGE ENGINE  NULL    GPL
INNODB_TRX      ACTIVE  INFORMATION SCHEMA      NULL    GPL
INNODB_LOCKS    ACTIVE  INFORMATION SCHEMA      NULL    GPL
INNODB_LOCK_WAITS       ACTIVE  INFORMATION SCHEMA      NULL    GPL
INNODB_CMP      ACTIVE  INFORMATION SCHEMA      NULL    GPL
INNODB_CMP_RESET        ACTIVE  INFORMATION SCHEMA      NULL    GPL
INNODB_CMPMEM   ACTIVE  INFORMATION SCHEMA      NULL    GPL
INNODB_CMPMEM_RESET     ACTIVE  INFORMATION SCHEMA      NULL    GPL
INNODB_CMP_PER_INDEX    ACTIVE  INFORMATION SCHEMA      NULL    GPL
INNODB_CMP_PER_INDEX_RESET      ACTIVE  INFORMATION SCHEMA      NULL    GPL
INNODB_BUFFER_PAGE      ACTIVE  INFORMATION SCHEMA      NULL    GPL
INNODB_BUFFER_PAGE_LRU  ACTIVE  INFORMATION SCHEMA      NULL    GPL
INNODB_BUFFER_POOL_STATS        ACTIVE  INFORMATION SCHEMA      NULL    GPL
INNODB_TEMP_TABLE_INFO  ACTIVE  INFORMATION SCHEMA      NULL    GPL
INNODB_METRICS  ACTIVE  INFORMATION SCHEMA      NULL    GPL
INNODB_FT_DEFAULT_STOPWORD      ACTIVE  INFORMATION SCHEMA      NULL    GPL
INNODB_FT_DELETED       ACTIVE  INFORMATION SCHEMA      NULL    GPL
INNODB_FT_BEING_DELETED ACTIVE  INFORMATION SCHEMA      NULL    GPL
INNODB_FT_CONFIG        ACTIVE  INFORMATION SCHEMA      NULL    GPL
INNODB_FT_INDEX_CACHE   ACTIVE  INFORMATION SCHEMA      NULL    GPL
INNODB_FT_INDEX_TABLE   ACTIVE  INFORMATION SCHEMA      NULL    GPL
INNODB_SYS_TABLES       ACTIVE  INFORMATION SCHEMA      NULL    GPL
INNODB_SYS_TABLESTATS   ACTIVE  INFORMATION SCHEMA      NULL    GPL
INNODB_SYS_INDEXES      ACTIVE  INFORMATION SCHEMA      NULL    GPL
INNODB_SYS_COLUMNS      ACTIVE  INFORMATION SCHEMA      NULL    GPL
INNODB_SYS_FIELDS       ACTIVE  INFORMATION SCHEMA      NULL    GPL
INNODB_SYS_FOREIGN      ACTIVE  INFORMATION SCHEMA      NULL    GPL
INNODB_SYS_FOREIGN_COLS ACTIVE  INFORMATION SCHEMA      NULL    GPL
INNODB_SYS_TABLESPACES  ACTIVE  INFORMATION SCHEMA      NULL    GPL
INNODB_SYS_DATAFILES    ACTIVE  INFORMATION SCHEMA      NULL    GPL
INNODB_SYS_VIRTUAL      ACTIVE  INFORMATION SCHEMA      NULL    GPL
MyISAM  ACTIVE  STORAGE ENGINE  NULL    GPL
MRG_MYISAM      ACTIVE  STORAGE ENGINE  NULL    GPL
PERFORMANCE_SCHEMA      ACTIVE  STORAGE ENGINE  NULL    GPL
ARCHIVE ACTIVE  STORAGE ENGINE  NULL    GPL
BLACKHOLE       ACTIVE  STORAGE ENGINE  NULL    GPL
FEDERATED       DISABLED        STORAGE ENGINE  NULL    GPL
partition       ACTIVE  STORAGE ENGINE  NULL    GPL
ngram   ACTIVE  FTPARSER        NULL    GPL
group_replication       ACTIVE  GROUP REPLICATION       group_replication.so    GPL
mysqlx  ACTIVE  DAEMON  mysqlx.so       GPL

.MySQL Client程序命令:

[root@localhost ~]# mysql -h 10.18.10.20  -P 3306 -u root -p -e "show plugins"
Enter password:
+----------------------------+----------+--------------------+----------------------+---------+
| Name                       | Status   | Type               | Library              | License |
+----------------------------+----------+--------------------+----------------------+---------+
| binlog                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| mysql_native_password      | ACTIVE   | AUTHENTICATION     | NULL                 | GPL     |
| sha256_password            | ACTIVE   | AUTHENTICATION     | NULL                 | GPL     |
| CSV                        | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| MEMORY                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| InnoDB                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| INNODB_TRX                 | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_LOCKS               | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_LOCK_WAITS          | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMP                 | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMP_RESET           | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMPMEM              | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMPMEM_RESET        | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMP_PER_INDEX       | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMP_PER_INDEX_RESET | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_BUFFER_PAGE         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_BUFFER_PAGE_LRU     | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_BUFFER_POOL_STATS   | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_TEMP_TABLE_INFO     | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_METRICS             | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_DEFAULT_STOPWORD | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_DELETED          | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_BEING_DELETED    | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_CONFIG           | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_INDEX_CACHE      | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_INDEX_TABLE      | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_TABLES          | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_TABLESTATS      | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_INDEXES         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_COLUMNS         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_FIELDS          | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_FOREIGN         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_FOREIGN_COLS    | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_TABLESPACES     | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_DATAFILES       | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_VIRTUAL         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| MyISAM                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| MRG_MYISAM                 | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| PERFORMANCE_SCHEMA         | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| ARCHIVE                    | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| BLACKHOLE                  | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| FEDERATED                  | DISABLED | STORAGE ENGINE     | NULL                 | GPL     |
| partition                  | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| ngram                      | ACTIVE   | FTPARSER           | NULL                 | GPL     |
| group_replication          | ACTIVE   | GROUP REPLICATION  | group_replication.so | GPL     |
| mysqlx                     | ACTIVE   | DAEMON             | mysqlx.so            | GPL     |
+----------------------------+----------+--------------------+----------------------+---------+

mysqlxsys@localhost用户帐号
安装X插件会创建一个mysqlxsys@localhost用户帐户。如果由于某种原因,创建用户帐户失败,X插件安装也会失败。下面是关于 mysqlxsys@localhost用户帐户的用途以及在创建失败时该怎么办的解释。

X 插件的安装过程使用 MySQL root账户为 `mysqlxsys@localhost` 用户创建一个内部账户。`mysqlxsys@localhost` 账户由 X 插件用于外部 用户对 MySQL 账户系统的身份验证,以及在特权用户请求时终止会话。`mysqlxsys@localhost` 账户创建时处于锁定状态,因此外部用户无法 使用它登录。如果由于某种原因 MySQL root账户不可用,在启动 X 插件安装之前,您必须在 `mysql` 命令行客户端中执行以下语句手动创建 `mysqlxsys@localhost` 用户:

mysql> CREATE USER IF NOT EXISTS mysqlxsys@localhost IDENTIFIED WITH mysql_native_password AS '123456' ACCOUNT LOCK;
Query OK, 0 rows affected (0.01 sec)

mysql> GRANT SELECT ON mysql.user TO mysqlxsys@localhost;
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT SUPER ON *.* TO mysqlxsys@localhost;
Query OK, 0 rows affected (0.01 sec)

MySQL Shell全局变量

MySQL Shell全局变量
MySQL Shell保留一些变量作为全局变量,这些变量被分配给脚本中常用的对象。本节描述可用的全局变量,并提供使用它们的示例。全局变量是:
.session 表示全局会话(如果已建立)
.db 表示已定义的模式,例如由URI定义的模式。

MySQL Shell为与使用全局变量相关的常见情况提供交互式错误解决方案。例如:
.试图使用未定义的session全局变量
.试图使用session检索不存在的模式
.试图使用未定义的db全局变量

未定义的全局会话
全局session变量在全局会话建立时设置。建立全局会话后,在MySQL Shell中使用session语句显示会话类型及其URI:

mysql-js> session

mysql-js>

如果没有建立全局会话,MySQL Shell显示如下信息:

mysql-js> session

mysql-js>

如果在没有建立全局会话的情况下试图使用session变量,则会启动交互式错误解析,并提示您提供建立全局会话所需的信息。如果会话成功建立,它会被赋值给session变量。提示如下:
.初始提示解释说没有建立全局会话,并询问是否应该建立全局会话。
.如果选择设置全局会话,则请求会话类型
.请求存储的会话的URI或别名
.如果需要,则需要密码

例如:

mysql-js> session.uri
The global session is not set, do you want to establish a session? [y/N]: y
Please specify the session type:
1) X
2) Node
3) Classic
Type: 2
Please specify the MySQL server URI (or $slias): root@localhost
Enter password:*******
root@localhost:33060
mysql-js>

未定义db变量
在建立全局会话并配置默认模式时,将设置global db变量。例如,使用root@localhost/sakila这样的URI建立一个全局会话,连接到localhost上的MySQL服务器,端口为33060。作为root用户,将模式sakila分配给全局变量db。定义好模式后,在MySQL Shell提示符下执行db命令会打印出模式名,如下所示:

mysql-js> db

mysql-js>

如果未建立全局会话,则显示如下信息:

mysql-js> db

mysql-js>

如果在没有建立全局会话的情况下尝试使用db变量,则会显示以下错误:

mysql-js> db.getCollections()
LogicError: The db variable is not set, establish a global session first.
at (shell):1:2
in db.getCollections()

如果已经建立了全局会话,但您试图使用未定义的数据库,则开始交互式错误解决,并提示您通过提供模式名称来定义活动模式。如果成功,则将db变量设置为定义的模式。例如:

mysql-js> db.getCollections()
The db variable is not set, do you want to set the active schema? [y/N]:y
Please specify the schema:world_x
[

]
mysql-js> db

mysql-js>

检索一个不存在的模式
如果尝试使用会话检索不存在的模式,交互式错误解决方案提供了创建模式的选项。

mysql-js> var mySchema = session.getSchema('my_test')
The schema my_test does not exist, do you want to create it? [y/N]: y
mysql-js> mySchema

mysql-js>

在所有情况下,如果您不提供解决每种情况所需的信息,则在未定义的变量上执行请求的语句将显示正确的结果。

MySQL Shell连接

MySQL Shell连接
MySQL Shell可以配置为在启动应用程序时使用命令选项连接到MySQL服务器,或者在MySQL Shell内部使用\connect命令连接到MySQL服务器。您 想要连接的MySQL服务器的地址可以使用单独的参数来指定,例如用户,主机名和端口,或者使用统一资源标识符(URI),格式为 user@host:port/schema,例如mike@myserver:33060/testDB。以下部分描述这些连接方法。

无论选择哪种方法连接,了解MySQL Shell如何处理密码都是很重要的。默认情况下,假定连接需要密码。在登录提示时要求输入密码。要指定 无密码帐户,请使用——password选项而不指定密码,或者在URI中的用户后面使用:而不指定密码。

如果您没有为连接指定参数,则使用以下默认值:
.user默认为当前系统用户名
.host默认为localhost
.port在使用X Session时默认为X Plugin端口33060,在使用Classic Session时默认为端口3306

使用X协议的MySQL Shell连接总是使用TCP,不支持使用Unix套接字。MySQL当满足以下条件时,Shell连接使用MySQL协议默认使用Unix套接字:
.–port未指定
.–host未指定或者为localhost
.–socket为到套接字提供了路径
.–classic被指定
如果指定了–host,但它不是localhost,则建立TCP连接。在这种情况下,如果没有指定–port,则使用默认值3306。如果满足套接字连接的条 件,但没有指定–socket,则使用默认套接字

使用URI字符串进行连接
通过使用–uri命令选项以字符串格式传递连接数据,可以配置MySQL Shell连接到的MySQL服务器。

使用以下格式:

[dbuser[:[dbpassword]]@]host[:port][/schema]

这些选项的说明:
.dbuser:指定认证过程中使用的MySQL用户帐号
.dbpassword:指定要用于身份验证过程的用户密码,不建议将密码存储在URI中。
.host:指定会话对象所连接的主机。如果未指定,则默认使用localhost。
.port:指定目标MySQL服务器正在监听连接的端口。如果没有指定,33060默认用于启用X协议的会话,而3306是传统MySQL协议会话的默认值。
.schema:指定会话建立时要设置为默认的数据库

如果没有使用URI指定密码(建议这样做),则会提示输入密码。下面的示例展示了如何使用这些命令选项:
.连接到端口33065的 Node 会话

[root@localhost ~]# mysqlsh --uri root@10.13.13.25:33065 --node
WARNING: The --node option was deprecated, please use --mysqlx instead. (Option has been processed as --mysqlx).
Please provide the password for 'root@localhost:33065': ******
MySQL Shell 8.0.41

Copyright (c) 2016, 2025, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates.
Other names may be trademarks of their respective owners.

Type '\help' or '\?' for help; '\quit' to exit.
Creating an X protocol session to 'root@localhost:33065'
Fetching schema names for auto-completion... Press ^C to stop.
Your MySQL connection id is 31
Server version: 5.7.26-log Source distribution
No default schema selected; type \use  to set one.
 MySQL  10.13.13.25:33065  JS >

.连接一个经典会话。

[root@localhost ~]# mysqlsh --uri root@10.13.13.25 --classic
WARNING: The --classic option was deprecated, please use --mysql instead. (Option has been processed as --mysql).
Please provide the password for 'root@10.13.13.25': ******
Save password for 'root@10.13.13.25'? [Y]es/[N]o/Ne[v]er (default No): N
MySQL Shell 8.0.41

Copyright (c) 2016, 2025, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates.
Other names may be trademarks of their respective owners.

Type '\help' or '\?' for help; '\quit' to exit.
Creating a Classic session to 'root@10.13.13.25'
Fetching schema names for auto-completion... Press ^C to stop.
Your MySQL connection id is 32
Server version: 5.7.26-log Source distribution
No default schema selected; type \use  to set one.
 MySQL  10.13.13.25:3306  JS >

虽然不建议使用无密码帐户,但也可以在用户名后使用“:”指定不需要密码的用户,例如:

[root@localhost ~]#mysqlsh --uri user:@localhost

使用单个参数进行连接
除了使用URI指定连接参数之外,还可以为每个值使用单独的参数定义连接数据
使用以下参数:
.–dbuser (-u) value
.–dbpassword value
.–host (-h) value
.–port (-P) value
.–schema (-D) value
.–password (-p)
.–socket (-S)

前5个参数匹配URI格式中使用的令牌,参数–password表示用户连接时不需要密码,为保持一致性,部分参数支持以下别名:
.–user相当于–dbuser
.–password 相当于 –dbpassword
.–database 相当于 –schema

当以多种方式指定参数时,适用以下规则:
.如果多次指定参数,则使用最后一次出现的值
.如果同时指定了各个连接参数和–uri,那么–uri的值将被视为基础,而各个参数的值会覆盖基础URI中的特定组件。

尝试在端口33065上与指定用户建立XSession。

[root@localhost ~]# mysqlsh -u root -h 10.13.13.25 -P 33065
Please provide the password for 'root@10.13.13.25:33065': ******
MySQL Shell 8.0.41

Copyright (c) 2016, 2025, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates.
Other names may be trademarks of their respective owners.

Type '\help' or '\?' for help; '\quit' to exit.
Creating a session to 'root@10.13.13.25:33065'
Fetching schema names for auto-completion... Press ^C to stop.
Your MySQL connection id is 34
Server version: 5.7.26-log Source distribution
No default schema selected; type \use  to set one.
 MySQL  10.13.13.25:33065  JS >

尝试与指定用户建立经典会话

[root@localhost ~]# mysqlsh -u root -h 10.13.13.25 --classic
WARNING: The --classic option was deprecated, please use --mysql instead. (Option has been processed as --mysql).
Please provide the password for 'root@10.13.13.25': ******
Save password for 'root@10.13.13.25'? [Y]es/[N]o/Ne[v]er (default No): N
MySQL Shell 8.0.41

Copyright (c) 2016, 2025, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates.
Other names may be trademarks of their respective owners.

Type '\help' or '\?' for help; '\quit' to exit.
Creating a Classic session to 'root@10.13.13.25'
Fetching schema names for auto-completion... Press ^C to stop.
Your MySQL connection id is 35
Server version: 5.7.26-log Source distribution
No default schema selected; type \use  to set one.
 MySQL  10.13.13.25:3306  JS >

尝试与指定用户建立节点会话

[root@localhost ~]# mysqlsh --node -u root -h 10.13.13.25
WARNING: The --node option was deprecated, please use --mysqlx instead. (Option has been processed as --mysqlx).
Please provide the password for 'root@10.13.13.25': ******
MySQL Shell 8.0.41

Copyright (c) 2016, 2025, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates.
Other names may be trademarks of their respective owners.

Type '\help' or '\?' for help; '\quit' to exit.
Creating an X protocol session to 'root@10.13.13.25:33060'
Fetching schema names for auto-completion... Press ^C to stop.
Your MySQL connection id is 36
Server version: 5.7.26-log Source distribution
No default schema selected; type \use  to set one.
 MySQL  10.13.13.25:33060  JS >

MySQL 5.7 组复制配置实践

MySQL组复制的配置实践
第一步是部署三个MySQL Server实例。Group Replication是MySQL Server 5.7.17及更新版本提供的内置MySQL插件。
下面的过程使用一台物理机器,因此每个MySQL服务器实例都需要一个特定的数据目录。在名为mysqldata的目录中创建数据目录,并对每个目录进行初始化。
创建三个数据目录

[mysql@localhost mysqldata]$ mkdir mysql1
[mysql@localhost mysqldata]$ mkdir mysql2
[mysql@localhost mysqldata]$ mkdir mysql3
[mysql@localhost mysqldata]$ ll
total 0
drwxr-xr-x. 2 mysql mysql 6 Jan 16 08:54 mysql1
drwxr-xr-x. 2 mysql mysql 6 Jan 16 08:55 mysql2
drwxr-xr-x. 2 mysql mysql 6 Jan 16 08:55 mysql3

创建三个实例的参数文件

[mysql@localhost mysql]# vi mysql1.cnf
[mysqld]
basedir=/mysqlsoft/mysql
datadir=/mysqldata/mysql1
bind-address=0.0.0.0
user=mysql
port=3306
log-error=/mysqldata/mysql1/mysql.err
pid-file=/mysqldata/mysql1/mysqld.pid
socket = /mysqldata/mysql1/mysql.sock
character-set-server=utf8mb4
default-storage-engine=INNODB

[mysql@localhost mysql]$ vi mysql2.cnf
[mysqld]
basedir=/mysqlsoft/mysql
datadir=/mysqldata/mysql2
bind-address=0.0.0.0
user=mysql
port=3307
log-error=/mysqldata/mysql2/mysql.err
pid-file=/mysqldata/mysql2/mysqld.pid
socket = /mysqldata/mysql2/mysql.sock
character-set-server=utf8mb4
default-storage-engine=INNODB


[mysql@localhost mysql]$ vi mysql3.cnf
[mysqld]
basedir=/mysqlsoft/mysql
datadir=/mysqldata/mysql3
bind-address=0.0.0.0
user=mysql
port=3308
log-error=/mysqldata/mysql3/mysql.err
pid-file=/mysqldata/mysql3/mysqld.pid
socket = /mysqldata/mysql3/mysql.sock
character-set-server=utf8mb4
default-storage-engine=INNODB

初始化三个实例

[root@localhost ~]# cd /mysqlsoft/mysql/bin
[root@localhost bin]# ./mysqld  --defaults-file=/mysqlsoft/mysql/mysql1.cnf --initialize -basedir=/mysqlsoft/mysql --

datadir=/mysqldata/mysql1 --user=mysql
[root@localhost bin]# ./mysqld  --defaults-file=/mysqlsoft/mysql/mysql2.cnf --initialize -basedir=/mysqlsoft/mysql --

datadir=/mysqldata/mysql2 --user=mysql
[root@localhost bin]# ./mysqld  --defaults-file=/mysqlsoft/mysql/mysql3.cnf --initialize -basedir=/mysqlsoft/mysql --

datadir=/mysqldata/mysql3 --user=mysql

[mysql@localhost mysql1]$ cat mysql.err
2025-01-16T02:45:38.125723Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --

explicit_defaults_for_timestamp server option (see documentation for more details).
2025-01-16T02:45:38.126190Z 0 [ERROR] Can't find error-message file 'asedir=/mysqlsoft/mysql/share/errmsg.sys'. Check error-

message file location and 'lc-messages-dir' configuration directive.
2025-01-16T02:45:38.535031Z 0 [Warning] InnoDB: New log files created, LSN=45790
2025-01-16T02:45:38.597593Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2025-01-16T02:45:38.658289Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this 

server has been started. Generating a new UUID: f81625c0-d3b3-11ef-9c8d-005056a390e6.
2025-01-16T02:45:38.659975Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2025-01-16T02:45:38.661884Z 1 [Note] A temporary password is generated for root@localhost: LplkX((&j1&u

[mysql@localhost mysql2]$ cat mysql.err
2025-01-16T02:45:51.143320Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --

explicit_defaults_for_timestamp server option (see documentation for more details).
2025-01-16T02:45:51.143570Z 0 [ERROR] Can't find error-message file 'asedir=/mysqlsoft/mysql/share/errmsg.sys'. Check error-

message file location and 'lc-messages-dir' configuration directive.
2025-01-16T02:45:51.439385Z 0 [Warning] InnoDB: New log files created, LSN=45790
2025-01-16T02:45:51.502171Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2025-01-16T02:45:51.561336Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this 

server has been started. Generating a new UUID: ffc6ff15-d3b3-11ef-9e2d-005056a390e6.
2025-01-16T02:45:51.562821Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2025-01-16T02:45:51.564054Z 1 [Note] A temporary password is generated for root@localhost: OM,#w?fll2iT


[mysql@localhost mysql3]$ cat mysql.err
2025-01-16T02:46:03.815721Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --

explicit_defaults_for_timestamp server option (see documentation for more details).
2025-01-16T02:46:03.815972Z 0 [ERROR] Can't find error-message file 'asedir=/mysqlsoft/mysql/share/errmsg.sys'. Check error-

message file location and 'lc-messages-dir' configuration directive.
2025-01-16T02:46:04.113214Z 0 [Warning] InnoDB: New log files created, LSN=45790
2025-01-16T02:46:04.171088Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2025-01-16T02:46:04.230517Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this 

server has been started. Generating a new UUID: 07542900-d3b4-11ef-a088-005056a390e6.
2025-01-16T02:46:04.232171Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2025-01-16T02:46:04.233327Z 1 [Note] A temporary password is generated for root@localhost: wlh%+FHw(7Sk

如果想服务能够部署自动支持安全连接,使用mysql_ssl_rsa_setup工具来创建缺省SSL与RSA文件

[root@localhost bin]# ./mysql_ssl_rsa_setup --datadir=/mysqldata/mysql1
Generating a 2048 bit RSA private key
...........+++
................................+++
writing new private key to 'ca-key.pem'
-----
Generating a 2048 bit RSA private key
.+++
.......................+++
writing new private key to 'server-key.pem'
-----
Generating a 2048 bit RSA private key
...............................+++
........................+++
writing new private key to 'client-key.pem'
-----
[root@localhost bin]# ./mysql_ssl_rsa_setup --datadir=/mysqldata/mysql2
Generating a 2048 bit RSA private key
........................+++
........................................................+++
writing new private key to 'ca-key.pem'
-----
Generating a 2048 bit RSA private key
................................+++
......................+++
writing new private key to 'server-key.pem'
-----
Generating a 2048 bit RSA private key
........................+++
......................................................................+++
writing new private key to 'client-key.pem'
-----
[root@localhost bin]# ./mysql_ssl_rsa_setup --datadir=/mysqldata/mysql3
Generating a 2048 bit RSA private key
........................................................................................................+++
...................+++
writing new private key to 'ca-key.pem'
-----
Generating a 2048 bit RSA private key
..................................+++
.......................................................................+++
writing new private key to 'server-key.pem'
-----
Generating a 2048 bit RSA private key
..............................................+++
........................+++
writing new private key to 'client-key.pem'
-----

配置启动脚本

[mysql@localhost mysql]$ cat my.cnf
[mysqld_multi]
mysqld=/mysqlsoft/mysql/bin/mysqld_safe
mysqladmin =/mysqlsoft/mysql/bin/mysqladmin
log =/mysqlsoft/mysql/mysqld_multi.log

[mysqld1]
basedir=/mysqlsoft/mysql
datadir=/mysqldata/mysql1
bind-address=0.0.0.0
user=mysql
port=3306
log-error=/mysqldata/mysql1/mysql.err
pid-file=/mysqldata/mysql1/mysqld.pid
socket = /mysqldata/mysql1/mysql.sock
character-set-server=utf8mb4
default-storage-engine=INNODB
explicit_defaults_for_timestamp = true


[mysqld2]
basedir=/mysqlsoft/mysql
datadir=/mysqldata/mysql2
bind-address=0.0.0.0
user=mysql
port=3307
log-error=/mysqldata/mysql2/mysql.err
pid-file=/mysqldata/mysql2/mysqld.pid
socket = /mysqldata/mysql2/mysql.sock
character-set-server=utf8mb4
default-storage-engine=INNODB
explicit_defaults_for_timestamp = true


[mysqld3]
basedir=/mysqlsoft/mysql
datadir=/mysqldata/mysql3
bind-address=0.0.0.0
user=mysql
port=3308
log-error=/mysqldata/mysql3/mysql.err
pid-file=/mysqldata/mysql3/mysqld.pid
socket = /mysqldata/mysql3/mysql.sock
character-set-server=utf8mb4
default-storage-engine=INNODB
explicit_defaults_for_timestamp = true

[mysql@localhost mysql]$ mysqld_multi start 1,2,3


[mysql@localhost mysql]$ tail -f mysqld_multi.log 
mysqld_multi log file version 2.16; run: Thu Jan 16 11:12:08 2025



Starting MySQL servers

2025-01-16T03:17:42.956897Z mysqld_safe Logging to '/mysqldata/mysql1/mysql.err'.
2025-01-16T03:17:42.968830Z mysqld_safe Logging to '/mysqldata/mysql3/mysql.err'.
2025-01-16T03:17:42.971621Z mysqld_safe Logging to '/mysqldata/mysql2/mysql.err'.
2025-01-16T03:17:42.978298Z mysqld_safe Logging to '/mysqldata/mysql1/mysql.err'.
2025-01-16T03:17:42.984997Z mysqld_safe Logging to '/mysqldata/mysql2/mysql.err'.
2025-01-16T03:17:42.999744Z mysqld_safe Logging to '/mysqldata/mysql3/mysql.err'.
2025-01-16T03:17:43.014252Z mysqld_safe A mysqld process already exists
2025-01-16T03:17:43.026350Z mysqld_safe Starting mysqld daemon with databases from /mysqldata/mysql3
2025-01-16T03:17:43.026973Z mysqld_safe Starting mysqld daemon with databases from /mysqldata/mysql2
2025-01-16T03:17:43.032460Z mysqld_safe A mysqld process already exists
2025-01-16T03:17:43.042893Z mysqld_safe Starting mysqld daemon with databases from /mysqldata/mysql2
2025-01-16T03:17:43.058374Z mysqld_safe Starting mysqld daemon with databases from /mysqldata/mysql3

组复制服务器设置
要安装和使用组复制插件,您必须正确配置MySQL服务器实例。建议将配置存储在实例的配置文件中。下面为mysql1服务器配置。

[mysql@localhost mysql]$ cat mysql1.cnf
[mysqld]
basedir=/mysqlsoft/mysql
datadir=/mysqldata/mysql1
bind-address=0.0.0.0
user=mysql
port=3306
log-error=/mysqldata/mysql1/mysql.err
pid-file=/mysqldata/mysql1/mysqld.pid
socket = /mysqldata/mysql1/mysql.sock
character-set-server=utf8mb4
default-storage-engine=INNODB

这些设置将MySQL服务器配置为使用前面创建的数据目录,以及服务器应该打开哪个端口并开始侦听传入的连接。

复制框架
以下设置根据“MySQL Group replication”的要求配置复制。

server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW

这些设置将服务器配置为使用唯一标识符1,以启用全局事务标识符,并将复制元数据存储在系统表而不是文件中。此外,它指示服务器打开二进制日志记录,使用基于行的格式并禁用二进制日志事件校验和。

组复制设置
此时,mysql1.cnf文件确保配置了服务器,并指示在给定配置下实例化复制基础结构。以下部分为服务器配置组复制设置。

transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="2366d798-4dc1-421a-a9de-3c825bfada7d"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "127.0.0.1:24901"
loose-group_replication_group_seeds= "127.0.0.1:24901,127.0.0.1:24902,127.0.0.1:24903"
loose-group_replication_bootstrap_group= off

上面用于group_replication变量的loose前缀指示,如果在服务器启动时没有加载Group Replication插件,则服务器继续启动。
.第1行指示服务器,对于每个事务,它必须收集写集,并使用XXHASH64散列算法将其编码为散列。

.第2行告诉插件它要加入或创建的组的名称为“2366d798-4dc1-421a-a9de-3c825bfada7d”。

.第3行指示插件在服务器启动时不要自动启动操作。

.第4行告诉插件使用IP地址127.0.0.1或localhost和端口24901来处理来自组中其他成员的传入连接。
服务器在这个端口上监听成员到成员的连接。此端口绝对不能用于用户应用程序,必须在运行组复制时为组的不同成员之间的通信保留该端口。

group_replication_local_address配置的本地地址必须对所有组成员都可访问。例如,如果每个服务器实例都在不同的机器上,则使用该机器的IP和端口,例如10.0.0.1:33061。group_replication_local_address的推荐端口是33061,但是在本教程中,我们使用在一台机器上运行的三个服务器实例,因此使用端口24901到24903。

.第5行告诉插件,如果需要加入组,应该联系这些主机和端口上的以下成员。这些是种子成员,当该成员想要连接到组时使用。在加入时,服务器首先与其中一个(种子)联系,然后要求组重新配置以允许加入服务器被组接受。请注意,此选项不需要列出组中的所有成员,而是在此服务器希望加入组时应该联系的服务器列表。

启动组的服务器不使用此选项,因为它是初始服务器,因此它负责引导组。第二个服务器加入要求组中唯一的成员加入,然后扩展组。第三个服务器加入可以请求这两个服务器中的任何一个加入,然后这个群组再次扩展。后续服务器在加入时重复此过程。

当同时加入多个服务器时,确保它们指向已经在组中的种子成员。不要使用正在加入组的成员作为种子,因为他们在联系时可能还不在组中。

最好的做法是先启动bootstrap成员,然后让它创建组。然后将其作为其他加入的成员的种子成员。这确保在加入其他成员时形成一个组。

不支持创建群组并同时加入多个成员。它可能会起作用,但很可能是操作竞争,然后加入组的行为以错误或超时告终。

.第6行指示插件是否启动组
此选项在任何时候都只能在一个服务器实例上使用,通常是在您第一次引导组时(或者在整个组被关闭并重新启动的情况下)。如果您多次引导组,例如当多个服务器实例设置了此选项时,那么它们可能会创建一个人工分裂的大脑场景,其中存在两个具有相同名称的不同组。在第一个服务器实例联机后禁用此选项。

组中所有服务器的配置非常相似。需要修改每个服务器的具体信息(例如server_id、datadir、group_replication_local_address)。

用户凭证
“组复制”通过异步复制协议实现分布式恢复,在组成员加入组之前先同步组成员。分布式恢复进程依赖于一个名为group_replication_recovery的复制区域通道,该区域通道用于在组成员之间传输事务。因此,需要设置具有相应权限的复制用户,以便Group replication建立成员间直接恢复复制通道。

[mysql@localhost mysql]$ mysqld --defaults-file=/mysqlsoft/mysql/mysql1.cnf &

创建一个具有REPLICATION-SLAVE权限的MySQL用户。不应该在二进制日志中捕获此过程,以避免将更改传播到其他服务器实例。在下面的示例中,显示了用户rpl_user和密码password。在配置服务器时,请使用合适的用户名和密码。连接到服务器mysql1,发出以下语句:

[root@localhost bin]# mysql -h 10.138.130.250 -P 3306 -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.26-log Source distribution

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SET SQL_LOG_BIN=0;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE USER rpl_user@'%' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)

mysql> SET SQL_LOG_BIN=1;
Query OK, 0 rows affected (0.00 sec)

按照上述方式配置用户后,使用CHANGE MASTER TO语句配置服务器,以便在下一次需要从另一个成员恢复其状态时,为group_replication_recovery复制通道使用给定的凭据。执行以下命令,将rpl_user和password替换为创建用户时使用的值。

mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.03 sec)

分布式恢复是加入组的服务器所采取的第一步。如果这些凭据设置不正确,服务器将无法运行恢复过程并获得与其他组成员的同步,因此最终无法加入组成员。类似地,如果成员不能通过服务器的主机名正确识别其他成员,则恢复过程可能会失败。建议运行MySQL的操作系统使用正确配置的唯一主机名,可以使用DNS或本地设置。这个主机名可以在performance_schema.replication_group_members表的Member_host列中进行验证。如果多个组成员外部化操作系统设置的默认主机名,则成员有可能无法解析到正确的成员地址,从而无法加入组。在这种情况下,使用report_host配置一个唯一的主机名,由每个服务器外部化。

启动组复制
配置并启动服务mysql1后,安装Group Replication插件。连接到服务器并发出以下命令:

mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
Query OK, 0 rows affected (0.06 sec)

重点:
mysql.session在加载组复制之前必须已经存在。mysql.ession在MySQL 5.7.19版本中被添加。如果您的数据字典是使用较早版本初始化的,则必须运行mysql_upgrade过程。如果不执行升级,则启动“组复制”失败,并提示错误信息

There was an error when trying to access the server with
user: mysql.session@localhost. Make sure the user is present
in the server and that mysql_upgrade was ran after a server
update..

要检查插件是否已成功安装,请执行SHOW PLUGINS;然后检查输出。它应该显示如下内容:

mysql> SHOW PLUGINS;
+----------------------------+----------+--------------------+----------------------+---------+
| Name                       | Status   | Type               | Library              | License |
+----------------------------+----------+--------------------+----------------------+---------+
| binlog                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| mysql_native_password      | ACTIVE   | AUTHENTICATION     | NULL                 | GPL     |
| sha256_password            | ACTIVE   | AUTHENTICATION     | NULL                 | GPL     |
| CSV                        | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| MEMORY                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| InnoDB                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| INNODB_TRX                 | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_LOCKS               | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_LOCK_WAITS          | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMP                 | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMP_RESET           | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMPMEM              | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMPMEM_RESET        | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMP_PER_INDEX       | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMP_PER_INDEX_RESET | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_BUFFER_PAGE         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_BUFFER_PAGE_LRU     | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_BUFFER_POOL_STATS   | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_TEMP_TABLE_INFO     | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_METRICS             | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_DEFAULT_STOPWORD | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_DELETED          | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_BEING_DELETED    | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_CONFIG           | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_INDEX_CACHE      | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_INDEX_TABLE      | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_TABLES          | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_TABLESTATS      | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_INDEXES         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_COLUMNS         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_FIELDS          | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_FOREIGN         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_FOREIGN_COLS    | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_TABLESPACES     | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_DATAFILES       | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_VIRTUAL         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| MyISAM                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| MRG_MYISAM                 | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| PERFORMANCE_SCHEMA         | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| ARCHIVE                    | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| BLACKHOLE                  | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| FEDERATED                  | DISABLED | STORAGE ENGINE     | NULL                 | GPL     |
| partition                  | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| ngram                      | ACTIVE   | FTPARSER           | NULL                 | GPL     |
| group_replication          | ACTIVE   | GROUP REPLICATION  | group_replication.so | GPL     |
+----------------------------+----------+--------------------+----------------------+---------+
45 rows in set (0.01 sec)

要启动组,请指示服务器mysql1引导组,然后启动组复制。这个引导应该只由单个服务器完成,即启动组的服务器,并且只能一次。这就是为什么引导配置选项的值没有保存在配置文件中。如果将其保存在配置文件中,则重启后服务器将自动引导具有相同名称的第二个组。这将导致两个具有相同名称的不同组。同样的道理也适用于将此选项设置为ON时停止和重新启动插件。

mysql> SET GLOBAL group_replication_bootstrap_group=ON;
Query OK, 0 rows affected (0.00 sec)

mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (2.09 sec)

mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
Query OK, 0 rows affected (0.00 sec)

一旦START GROUP_REPLICATION语句返回,这个组就已经启动了。你可以检查组现在已经创建,并且里面有一个成员:

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | f81625c0-d3b3-11ef-9c8d-005056a390e6 | mysqlcs     |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
1 row in set (0.01 sec)

该表中的信息确认组中有一个具有唯一标识符f81625c0-d3b3-11ef-9c8d-005056a390e6的成员,它是ONLINE的,并且在mysqlcs上监听端口3306上的客户端连接。
为了演示服务器确实在一个组中,并且它能够处理负载,创建一个表并向其中添加一些内容。

mysql> CREATE DATABASE test;
Query OK, 1 row affected (0.01 sec)

mysql> USE test;
Database changed
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO t1 VALUES (1, 'Luis');
Query OK, 1 row affected (0.04 sec)

检查表t1和二进制日志的内容。

mysql> SELECT * FROM t1;
+----+------+
| c1 | c2   |
+----+------+
|  1 | Luis |
+----+------+
1 row in set (0.00 sec)


mysql> SHOW BINLOG EVENTS;
+---------------+-----+----------------+-----------+-------------+--------------------------------------------------------------------+
| Log_name      | Pos | Event_type     | Server_id | End_log_pos | Info                                                               |
+---------------+-----+----------------+-----------+-------------+--------------------------------------------------------------------+
| binlog.000001 |   4 | Format_desc    |         1 |         123 | Server ver: 5.7.26-log, Binlog ver: 4                              |
| binlog.000001 | 123 | Previous_gtids |         1 |         150 |                                                                    |
| binlog.000001 | 150 | Gtid           |         1 |         211 | SET @@SESSION.GTID_NEXT= 'f81625c0-d3b3-11ef-9c8d-005056a390e6:1'  |
| binlog.000001 | 211 | Query          |         1 |         301 | CREATE DATABASE test                                               |
| binlog.000001 | 301 | Gtid           |         1 |         362 | SET @@SESSION.GTID_NEXT= 'f81625c0-d3b3-11ef-9c8d-005056a390e6:2'  |
| binlog.000001 | 362 | Query          |         1 |         486 | use `test`; CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL) |
| binlog.000001 | 486 | Gtid           |         1 |         547 | SET @@SESSION.GTID_NEXT= 'f81625c0-d3b3-11ef-9c8d-005056a390e6:3'  |
| binlog.000001 | 547 | Query          |         1 |         615 | BEGIN                                                              |
| binlog.000001 | 615 | Table_map      |         1 |         658 | table_id: 108 (test.t1)                                            |
| binlog.000001 | 658 | Write_rows     |         1 |         700 | table_id: 108 flags: STMT_END_F                                    |
| binlog.000001 | 700 | Xid            |         1 |         727 | COMMIT /* xid=23 */                                                |
+---------------+-----+----------------+-----------+-------------+--------------------------------------------------------------------+
11 rows in set (0.00 sec)

如上所述,创建了数据库和表对象,并将它们对应的DDL语句写入二进制日志。此外,还将数据插入表并写入二进制日志。下一节将说明二进制日志条目的重要性,当组增长时,当新成员试图赶上并联机时,将执行分布式恢复。
向组中添加实例
此时,组中有一个成员服务器mysql1,其中包含一些数据。现在是时候通过添加前面配置的另外两个服务器来扩展组了。
添加第二个实例
为了添加第二个实例,服务器mysql2,首先为它创建配置文件。该配置类似于服务器mysql1所使用的配置,除了数据目录的位置、mysql2将要侦听的端口或其server_id等内容。这些不同的行在下面的清单中突出显示。
[mysql@localhost mysql]$ vi mysql2.cnf
[mysqld]
basedir=/mysqlsoft/mysql
datadir=/mysqldata/mysql2
bind-address=0.0.0.0
user=mysql
port=3307
log-error=/mysqldata/mysql2/mysql.err
pid-file=/mysqldata/mysql2/mysqld.pid
socket = /mysqldata/mysql2/mysql.sock
character-set-server=utf8mb4
default-storage-engine=INNODB

server_id=2
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW

transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="2366d798-4dc1-421a-a9de-3c825bfada7d"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "127.0.0.1:24902"
loose-group_replication_group_seeds= "127.0.0.1:24901,127.0.0.1:24902,127.0.0.1:24903"
loose-group_replication_bootstrap_group= off

与服务器mysql1的过程类似,配置文件就绪后启动服务器

[mysql@localhost mysql]$ mysqld --defaults-file=/mysqlsoft/mysql/mysql2.cnf &

然后配置恢复凭据,如下所示。这些命令与将服务器mysql1设置为用户在组内共享时使用的命令相同。在mysql2上发表以下声明。

[root@localhost /]#  mysql -h 10.138.130.250 -P 3307 -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.26-log Source distribution

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SET SQL_LOG_BIN=0;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE USER rpl_user@'%';
Query OK, 0 rows affected (0.01 sec)

mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' IDENTIFIED BY 'password';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> SET SQL_LOG_BIN=1;
Query OK, 0 rows affected (0.00 sec)

mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.02 sec)

安装Group Replication插件并启动将服务器加入组的过程。下面的示例以与部署服务器mysql1时相同的方式安装插件。

mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
Query OK, 0 rows affected (0.01 sec)

mysql> SHOW PLUGINS;
+----------------------------+----------+--------------------+----------------------+---------+
| Name                       | Status   | Type               | Library              | License |
+----------------------------+----------+--------------------+----------------------+---------+
| binlog                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| mysql_native_password      | ACTIVE   | AUTHENTICATION     | NULL                 | GPL     |
| sha256_password            | ACTIVE   | AUTHENTICATION     | NULL                 | GPL     |
| CSV                        | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| MEMORY                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| InnoDB                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| INNODB_TRX                 | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_LOCKS               | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_LOCK_WAITS          | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMP                 | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMP_RESET           | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMPMEM              | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMPMEM_RESET        | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMP_PER_INDEX       | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_CMP_PER_INDEX_RESET | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_BUFFER_PAGE         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_BUFFER_PAGE_LRU     | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_BUFFER_POOL_STATS   | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_TEMP_TABLE_INFO     | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_METRICS             | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_DEFAULT_STOPWORD | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_DELETED          | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_BEING_DELETED    | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_CONFIG           | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_INDEX_CACHE      | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_FT_INDEX_TABLE      | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_TABLES          | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_TABLESTATS      | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_INDEXES         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_COLUMNS         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_FIELDS          | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_FOREIGN         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_FOREIGN_COLS    | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_TABLESPACES     | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_DATAFILES       | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| INNODB_SYS_VIRTUAL         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |
| MyISAM                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| MRG_MYISAM                 | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| PERFORMANCE_SCHEMA         | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| ARCHIVE                    | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| BLACKHOLE                  | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| FEDERATED                  | DISABLED | STORAGE ENGINE     | NULL                 | GPL     |
| partition                  | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| ngram                      | ACTIVE   | FTPARSER           | NULL                 | GPL     |
| group_replication          | ACTIVE   | GROUP REPLICATION  | group_replication.so | GPL     |
+----------------------------+----------+--------------------+----------------------+---------+
45 rows in set (0.01 sec)

将服务器mysql2加入组。

mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (5.85 sec)

与之前在mysql1在执行的步骤不相同,差异在于没有执行SET GLOBAL group_replication_bootstrap_group=ON;在启动组复制之前,因为组已经创建并且由服务器mysql1启动。所以这时服务器mysql2只需要被加入到现有的组中。

当组复制成功启动并且服务器加入组时,它会检查super_read_only变量。通过在成员的配置文件中将super_read_only设置为ON,可以确保在启动Group Replication时由于任何原因而失败的服务器不接受事务。如果服务器应该作为读写实例加入组,例如作为单主组中的主实例或作为多主组的成员,当super_read_only变量设置为ON时,则在加入组时将其设置为OFF。

检查performance_schema.replication_group_members表再次显示,现在组中有两个ONLINE服务器。

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | f81625c0-d3b3-11ef-9c8d-005056a390e6 | mysqlcs     |        3306 | ONLINE       |
| group_replication_applier | ffc6ff15-d3b3-11ef-9e2d-005056a390e6 | mysqlcs     |        3307 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
2 rows in set (0.00 sec)

由于服务器mysql2也被标记为ONLINE,它一定已经自动赶上了服务器mysql1。验证它确实已与服务器mysql1同步,如下所示。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.00 sec)

mysql> select * from test.t1;
+----+------+
| c1 | c2   |
+----+------+
|  1 | Luis |
+----+------+
1 row in set (0.00 sec)

mysql> SHOW BINLOG EVENTS;
+---------------+-----+----------------+-----------+-------------+---------------------------------------+
| Log_name      | Pos | Event_type     | Server_id | End_log_pos | Info                                  |
+---------------+-----+----------------+-----------+-------------+---------------------------------------+
| binlog.000001 |   4 | Format_desc    |         2 |         123 | Server ver: 5.7.26-log, Binlog ver: 4 |
| binlog.000001 | 123 | Previous_gtids |         2 |         150 |                                       |
+---------------+-----+----------------+-----------+-------------+---------------------------------------+
2 rows in set (0.00 sec)

如上所述,第二台服务器已添加到组中,并且它自动复制了服务器mysql1的更改。根据分布式恢复过程,这意味着在加入组之后,在被声明为在线之前,服务器mysql2已经自动连接到服务器mysql1,并从中获取丢失的数据。换句话说,它从它缺失的二进制日志mysql1中复制事务,直到它加入组的时间点。

添加其他实例
向组中添加更多实例的步骤基本上与添加第二台服务器时相同,只是配置需要像为服务器mysql2 操作那样进行更改。要总结所需的命令:
1.修改配置文件

[mysql@localhost mysql]$ vi mysql3.cnf
[mysqld]
basedir=/mysqlsoft/mysql
datadir=/mysqldata/mysql3
bind-address=0.0.0.0
user=mysql
port=3308
log-error=/mysqldata/mysql3/mysql.err
pid-file=/mysqldata/mysql3/mysqld.pid
socket = /mysqldata/mysql3/mysql.sock
character-set-server=utf8mb4
default-storage-engine=INNODB

server_id=3
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW

transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="2366d798-4dc1-421a-a9de-3c825bfada7d"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "127.0.0.1:24903"
loose-group_replication_group_seeds= "127.0.0.1:24901,127.0.0.1:24902,127.0.0.1:24903"
loose-group_replication_bootstrap_group= off

2.启动服务器

[mysql@localhost mysql]$ mysqld --defaults-file=/mysqlsoft/mysql/mysql3.cnf &

3.配置group_replication_recovery通道的恢复凭据。

[root@mysqlcs ~]# mysql -h 10.138.130.250 -P 3308 -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.26-log Source distribution

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SET SQL_LOG_BIN=0;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE USER rpl_user@'%';
ERROR 1396 (HY000): Operation CREATE USER failed for 'rpl_user'@'%'
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' IDENTIFIED BY '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)

mysql> SET SQL_LOG_BIN=1;
Query OK, 0 rows affected (0.00 sec)

mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.02 sec)

4.安装Group Replication插件并启动它。

mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
Query OK, 0 rows affected (0.02 sec)

mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (3.29 sec)

此时,服务器mysql3已经启动并运行,加入了组,并赶上了组中的其他服务器。查询performance_schema。Replication_group_members表再次

证实了这一点。

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 07542900-d3b4-11ef-a088-005056a390e6 | mysqlcs     |        3308 | ONLINE       |
| group_replication_applier | f81625c0-d3b3-11ef-9c8d-005056a390e6 | mysqlcs     |        3306 | ONLINE       |
| group_replication_applier | ffc6ff15-d3b3-11ef-9e2d-005056a390e6 | mysqlcs     |        3307 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
3 rows in set (0.00 sec)

在服务器mysql2或服务器mysql1上执行相同的查询会产生相同的结果。此外,您可以验证服务器mysql3也赶上了:

mysql> SHOW DATABASES LIKE 'test';
+-----------------+
| Database (test) |
+-----------------+
| test            |
+-----------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM test.t1;
+----+------+
| c1 | c2   |
+----+------+
|  1 | Luis |
+----+------+
1 row in set (0.00 sec)

mysql> SHOW BINLOG EVENTS;
+---------------+------+----------------+-----------+-------------+--------------------------------------------------------------------+
| Log_name      | Pos  | Event_type     | Server_id | End_log_pos | Info                                                               |
+---------------+------+----------------+-----------+-------------+--------------------------------------------------------------------+
| binlog.000001 |    4 | Format_desc    |         3 |         123 | Server ver: 5.7.26-log, Binlog ver: 4                              |
| binlog.000001 |  123 | Previous_gtids |         3 |         150 |                                                                    |
| binlog.000001 |  150 | Gtid           |         1 |         211 | SET @@SESSION.GTID_NEXT= 'f81625c0-d3b3-11ef-9c8d-005056a390e6:1'  |
| binlog.000001 |  211 | Query          |         1 |         301 | CREATE DATABASE test                                               |
| binlog.000001 |  301 | Gtid           |         1 |         362 | SET @@SESSION.GTID_NEXT= 'f81625c0-d3b3-11ef-9c8d-005056a390e6:2'  |
| binlog.000001 |  362 | Query          |         1 |         486 | use `test`; CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL) |
| binlog.000001 |  486 | Gtid           |         1 |         547 | SET @@SESSION.GTID_NEXT= 'f81625c0-d3b3-11ef-9c8d-005056a390e6:3'  |
| binlog.000001 |  547 | Query          |         1 |         606 | BEGIN                                                              |
| binlog.000001 |  606 | Table_map      |         1 |         649 | table_id: 108 (test.t1)                                            |
| binlog.000001 |  649 | Write_rows     |         1 |         691 | table_id: 108 flags: STMT_END_F                                    |
| binlog.000001 |  691 | Xid            |         1 |         718 | COMMIT /* xid=26 */                                                |
| binlog.000001 |  718 | Gtid           |         1 |         779 | SET @@SESSION.GTID_NEXT= '2366d798-4dc1-421a-a9de-3c825bfada7d:1'  |
| binlog.000001 |  779 | Query          |         1 |         838 | BEGIN                                                              |
| binlog.000001 |  838 | View_change    |         1 |         977 | view_id=17375148526840614:1                                        |
| binlog.000001 |  977 | Query          |         1 |        1042 | COMMIT                                                             |
| binlog.000001 | 1042 | Gtid           |         1 |        1103 | SET @@SESSION.GTID_NEXT= '2366d798-4dc1-421a-a9de-3c825bfada7d:2'  |
| binlog.000001 | 1103 | Query          |         1 |        1162 | BEGIN                                                              |
| binlog.000001 | 1162 | View_change    |         1 |        1341 | view_id=17375148526840614:2                                        |
| binlog.000001 | 1341 | Query          |         1 |        1406 | COMMIT                                                             |
| binlog.000001 | 1406 | Gtid           |         1 |        1467 | SET @@SESSION.GTID_NEXT= '2366d798-4dc1-421a-a9de-3c825bfada7d:3'  |
| binlog.000001 | 1467 | Query          |         1 |        1526 | BEGIN                                                              |
| binlog.000001 | 1526 | View_change    |         1 |        1705 | view_id=17375148526840614:3                                        |
| binlog.000001 | 1705 | Query          |         1 |        1770 | COMMIT                                                             |
+---------------+------+----------------+-----------+-------------+--------------------------------------------------------------------+
23 rows in set (0.00 sec)

MySQL组复制组名不是有效的UUID

在使用 启动MySQL Group Replication 时,遇到如下错误信息

mysql> START GROUP_REPLICATION;
ERROR 3092 (HY000): The server is not configured properly to be an active member of the group. Please see more details on error log.

err.log文件中:

2025-01-22T02:14:04.090619Z 4 [ERROR] Plugin group_replication reported: 'The group name 'repl_group1' is not a valid UUID'

“Plugin group_replication reported: ‘The group name ‘repl_group1’ is not a valid UUID'” 通常意味着你在配置组复制时使用了不正确的组名格式。在 MySQL 的 Group Replication 中,组名必须是一个有效的 UUID。
解决步骤
1.生成一个有效的 UUID:
可以使用在线工具或者命令行来生成一个 UUID。例如,在 Linux 系统中,你可以使用 uuidgen 命令:

[mysql@localhost mysql]$ uuidgen
2366d798-4dc1-421a-a9de-3c825bfada7d

这将输出一个形如 2366d798-4dc1-421a-a9de-3c825bfada7d 的 UUID。

2.修改配置文件:
在你的 MySQL 配置文件(通常是 my.cnf 或 my.ini)中,将 group_replication_group_name 的值设置为上一步生成的 UUID。例如:

[mysql@localhost mysql]$ vi mysql1.cnf
loose-group_replication_group_name="2366d798-4dc1-421a-a9de-3c825bfada7d"

3.重启 MySQL 服务:
修改配置后,需要重启 MySQL 服务以使更改生效。可以使用如下命令:

[mysql@localhost mysql]$  mysqld --defaults-file=/mysqlsoft/mysql/mysql1.cnf

4.验证配置:
在 MySQL 命令行中,你可以使用以下命令来检查组复制的配置:

mysql> SHOW GLOBAL VARIABLES LIKE 'group_replication_%';
+----------------------------------------------------+-------------------------------------------------+
| Variable_name                                      | Value                                           |
+----------------------------------------------------+-------------------------------------------------+
| group_replication_allow_local_disjoint_gtids_join  | OFF                                             |
| group_replication_allow_local_lower_version_join   | OFF                                             |
| group_replication_auto_increment_increment         | 7                                               |
| group_replication_bootstrap_group                  | OFF                                             |
| group_replication_components_stop_timeout          | 31536000                                        |
| group_replication_compression_threshold            | 1000000                                         |
| group_replication_enforce_update_everywhere_checks | OFF                                             |
| group_replication_exit_state_action                | READ_ONLY                                       |
| group_replication_flow_control_applier_threshold   | 25000                                           |
| group_replication_flow_control_certifier_threshold | 25000                                           |
| group_replication_flow_control_mode                | QUOTA                                           |
| group_replication_force_members                    |                                                 |
| group_replication_group_name                       | 2366d798-4dc1-421a-a9de-3c825bfada7d            |
| group_replication_group_seeds                      | 127.0.0.1:24901,127.0.0.1:24902,127.0.0.1:24903 |
| group_replication_gtid_assignment_block_size       | 1000000                                         |
| group_replication_ip_whitelist                     | AUTOMATIC                                       |
| group_replication_local_address                    | 127.0.0.1:24903                                 |
| group_replication_member_weight                    | 50                                              |
| group_replication_poll_spin_loops                  | 0                                               |
| group_replication_recovery_complete_at             | TRANSACTIONS_APPLIED                            |
| group_replication_recovery_reconnect_interval      | 60                                              |
| group_replication_recovery_retry_count             | 10                                              |
| group_replication_recovery_ssl_ca                  |                                                 |
| group_replication_recovery_ssl_capath              |                                                 |
| group_replication_recovery_ssl_cert                |                                                 |
| group_replication_recovery_ssl_cipher              |                                                 |
| group_replication_recovery_ssl_crl                 |                                                 |
| group_replication_recovery_ssl_crlpath             |                                                 |
| group_replication_recovery_ssl_key                 |                                                 |
| group_replication_recovery_ssl_verify_server_cert  | OFF                                             |
| group_replication_recovery_use_ssl                 | OFF                                             |
| group_replication_single_primary_mode              | ON                                              |
| group_replication_ssl_mode                         | DISABLED                                        |
| group_replication_start_on_boot                    | OFF                                             |
| group_replication_transaction_size_limit           | 0                                               |
| group_replication_unreachable_majority_timeout     | 0                                               |
+----------------------------------------------------+-------------------------------------------------+
36 rows in set (0.01 sec)

确保 group_replication_group_name 的值是你设置的 UUID。

5.初始化组复制:
如果这是第一次设置组复制,确保每个服务器都已经正确配置并且可以相互通信。然后,你可以初始化组复制:

mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.02 sec)

mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (3.29 sec)

确保 repl_user 和 123456是正确设置的复制用户和密码。
通过以上步骤,你应该能够解决因组名格式不正确导致的错误,并成功设置 MySQL 的 Group Replication。如果问题仍然存在,请检查网络设置和防火墙规则是否允许服务器之间的通信。

MySQL 5.7 延迟复制

延迟复制
MySQL 5.7支持延迟复制,这样从服务器就会故意滞后于主服务器至少一段指定的时间。缺省值为0秒。使用MASTER_DELAY选项更改MASTER TO将 延迟设置为N秒:
CHANGE MASTER TO MASTER_DELAY = N;

从主机接收到的事件至少要比它在主机上的执行晚N秒才执行。例外情况是,格式描述事件或日志文件旋转事件没有延迟,它们只影响SQL线程的 内部状态。

延迟复制可用于以下几个目的:
.防止用户在主机上出错。DBA可以将延迟的从服务器回滚到灾难发生之前的时间

.测试系统在出现延迟时的行为。例如,在应用程序中,延迟可能是由从属服务器上的沉重负载引起的。但是,很难生成这种负载级别。延迟复 制可以模拟延迟,而不必模拟负载。它还可以用于调试与滞后从机相关的条件。

.检查数据库很久以前的样子,而无需重新加载备份。例如,如果延迟是一周,DBA需要查看数据库在最后几天的开发之前是什么样子,那么可以 检查延迟的从属服务器。

START SLAVE和STOP SLAVE立即生效并忽略任何延迟。RESET SLAVE将延迟复位为0。

SHOW SLAVE STATUS有三个字段提供延迟信息:
.SQL_Delay: 一个非负整数,表示从服务器必须滞后于主服务器的秒数

.SQL_Remaining_Delay: 当Slave_SQL_Running_State为Waiting until MASTER_DELAY seconds after master executed event,该字段包含一 个整数,表示延迟剩余的秒数。在其他时候,该字段为NULL。

.Slave_SQL_Running_State:指示SQL线程状态的字符串(类似于Slave_IO_State)。该值与SHOW PROCESSLIST显示的SQL线程的State值相同。

mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.138.130.243
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: binlog.000010
          Read_Master_Log_Pos: 2099
               Relay_Log_File: localhost-relay-bin.000003
                Relay_Log_Pos: 877
        Relay_Master_Log_File: binlog.000010
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 2099
              Relay_Log_Space: 1689
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 2
                  Master_UUID: 684e1f7d-6f47-11ef-a6d5-005056a3a162
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set:
            Executed_Gtid_Set: 684e1f7d-6f47-11ef-a6d5-005056a3a162:9-11,
bb8b95d1-6f47-11ef-9592-005056a390e6:9-10,
ca006ef3-6f46-11ef-8203-005056b9a980:1-5
                Auto_Position: 0
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:
1 row in set (0.01 sec)

mysql> SHOW PROCESSLIST\G
*************************** 1. row ***************************
     Id: 38
   User: system user
   Host:
     db: NULL
Command: Connect
   Time: 2046
  State: Slave has read all relay log; waiting for more updates
   Info: NULL
*************************** 2. row ***************************
     Id: 39
   User: root
   Host: localhost
     db: jycs
Command: Query
   Time: 0
  State: starting
   Info: SHOW PROCESSLIST
*************************** 3. row ***************************
     Id: 40
   User: system user
   Host:
     db: NULL
Command: Connect
   Time: 3682
  State: Waiting for master to send event
   Info: NULL
3 rows in set (0.00 sec)

当从SQL线程在执行事件之前等待延迟结束时,SHOW PROCESSLIST将其State值显示为waiting until MASTER_DELAY seconds after master executed event。

在从服务器上设置延迟复制时间为60秒:

mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State: Connecting to master
                  Master_Host: 10.138.130.243
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: binlog.000010
          Read_Master_Log_Pos: 2659
               Relay_Log_File: localhost-relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: binlog.000010
             Slave_IO_Running: Connecting
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 2659
              Relay_Log_Space: 154
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 2
                  Master_UUID: 684e1f7d-6f47-11ef-a6d5-005056a3a162
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 60 --延迟复制时间为60秒
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set:
            Executed_Gtid_Set: 684e1f7d-6f47-11ef-a6d5-005056a3a162:9-11,
bb8b95d1-6f47-11ef-9592-005056a390e6:9-10,
ca006ef3-6f46-11ef-8203-005056b9a980:1-5
                Auto_Position: 0
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:
1 row in set (0.00 sec)

主服务器上插入数据

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2024-12-20 17:22:37 |
+---------------------+
1 row in set (0.00 sec)

mysql> insert into t_cs values(6,'ij');
Query OK, 1 row affected (0.03 sec)

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2024-12-20 17:22:56 |
+---------------------+
1 row in set (0.00 sec)

从服务器上验证延迟复制

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2024-12-20 17:14:31 |
+---------------------+
1 row in set (0.00 sec)

mysql> select * from t_cs;
+------+------+
| id   | name |
+------+------+
|    1 | cs   |
|    2 | ab   |
|    3 | cd   |
|    4 | ef   |
|    5 | gh   |
+------+------+
5 rows in set (0.00 sec)

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2024-12-20 17:14:37 |
+---------------------+
1 row in set (0.00 sec)

mysql> select * from t_cs;
+------+------+
| id   | name |
+------+------+
|    1 | cs   |
|    2 | ab   |
|    3 | cd   |
|    4 | ef   |
|    5 | gh   |
+------+------+
5 rows in set (0.00 sec)

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2024-12-20 17:14:51 |
+---------------------+
1 row in set (0.00 sec)

在延迟1分钟后,主服务器上插入的新记录被复制到从服务器

mysql> select * from t_cs;
+------+------+
| id   | name |
+------+------+
|    1 | cs   |
|    2 | ab   |
|    3 | cd   |
|    4 | ef   |
|    5 | gh   |
|    6 | ij   |
+------+------+
6 rows in set (0.01 sec)

MySQL 5.7 半同步复制

半同步复制
除了内置的异步复制之外,MySQL 5.7还支持一个通过插件实现的半同步复制接口。本节讨论什么是半同步复制以及它是如何工作的。以下部分 将介绍半同步复制的管理接口,以及如何安装、配置和监视它。

默认情况下,MySQL的复制是异步的。主服务器将事件写入其二进制日志,但不知道从服务器是否或何时检索并处理了这些事件。使用异步复制 时,如果主服务器崩溃,则它提交的事务可能没有传输到任何从服务器。因此,在这种情况下,从主服务器到从服务器的故障转移可能导致故障 转移到一个相对于主服务器缺少事务的服务器。

半同步复制可以作为异步复制的替代方案:
.从节点表示它连接到主节点时是否具有半同步能力

.如果在主端启用了半同步复制,并且至少有一个半同步从端,那么在主端执行事务提交的线程将阻塞并等待,直到至少一个半同步从端确认它 已接收到该事务的所有事件,或者直到超时发生。

.从属服务器只有在将事务事件写入其中继日志并刷新到磁盘后,才会确认接收到事务事件。

.如果超时发生,而从服务器没有确认事务,则主服务器恢复到异步复制。当至少有一个半同步从端赶上时,主端返回到半同步复制。

.必须在主端和从端同时启用半同步复制。如果在主端禁用了半同步复制,或者在主端启用了半同步复制,但没有从端,则主端使用异步复制

当主服务器阻塞(等待从服务器的确认)时,它不会返回到执行该事务的会话。当阻塞束时,主程序返回到会话,然后可以继续执行其他语句。 此时,事务已在主端提交,并且至少有一个从端已确认其事件的接收。

从MySQL 5.7.3开始,主服务器在处理每个事务之前必须接收的从服务器应答的数量可以使用rpl_semi_sync_master_wait_for_slave_count系统 变量进行配置。缺省值为1。

在写入二进制日志的回滚之后也会发生阻塞,当回滚修改非事务性表的事务时也会发生阻塞。回滚的事务被记录下来,即使它对事务性表没有影 响,因为对非事务性表的修改不能回滚,必须发送到从表。

对于不在事务上下文中出现的语句(即,当没有使用START transaction或SET autocommit = 0启动事务时),启用自动提交,并且每个语句都 隐式提交。对于半同步复制,主程序阻塞每个这样的语句,就像它对显式事务提交所做的那样。

为了理解“半同步复制”中的“semi”是什么意思,将其与异步复制和全同步复制进行比较:
.使用异步复制,主服务器将事件写入其二进制日志,从服务器在准备好时请求事件。不能保证任何事件都会同步到任何一个从服务器。
.使用完全同步复制,当主服务器提交事务时,所有从服务器也将在主服务器返回到执行事务的会话之前提交该事务。这样做的缺点是完成事务 可能会有很多延迟。
.半同步复制介于异步复制和全同步复制之间。主服务器只等待至少一个从服务器接收并记录事件。它不等待所有从服务器确认接收,它只需要 接收,而不需要在从服务器端完全执行和提交事件。

与异步复制相比,半同步复制提供了更好的数据完整性,因为当提交成功返回时,可以知道数据至少存在于两个位置。在半同步主服务器收到 rpl_semi_sync_master_wait_for_slave_count配置的从服务器数量的确认之前,事务处于暂停状态,不会提交。

半同步复制还通过限制二进制日志事件从主服务器发送到从服务器的速度,对繁忙会话设置了速率限制。当一个用户太忙时,这将降低其速度, 这在某些部署情况下很有用。

半同步复制确实有一些性能影响,因为由于需要等待从,提交速度较慢。这是为了提高数据完整性而进行的权衡。减慢的时间至少是TCP/IP往返 时间,从服务器发送提交到从服务器并等待从服务器确认接收。这意味着,对于通过快速网络通信的近距离服务器,半同步复制效果最好,而对 于通过慢速网络通信的远程服务器,效果最差。

rpl_semi_sync_master_wait_point系统变量控制半同步复制主服务器在向提交事务的客户机返回状态之前等待从服务器确认事务接收的时间点 。这些值是允许的:
.AFTER_SYNC(默认值):主服务器将每个事务写入其二进制日志和从服务器,并将二进制日志同步到磁盘。同步完成后,主服务器等待从服务器对 事务接收的确认。接收到确认后,主服务器将事务提交给存储引擎,并将结果返回给客户端,然后客户端就可以继续进行了。
.AFTER_COMMIT:主服务器将每个事务写入其二进制日志和从服务器,同步二进制日志,并将事务提交给存储引擎。在提交之后,主服务器等待从 服务器对事务接收的确认。接收到确认后,主服务器将结果返回给客户端,然后客户端可以继续进行。

这些设置的复制特性区别如下:
.使用AFTER_SYNC,所有客户端同时看到提交的事务:在它被从服务器确认并提交到主服务器上的存储引擎之后。因此,所有客户端都在主服务 器上看到相同的数据。
在主服务器发生故障时,主服务器上提交的所有事务都被复制到从服务器(保存到其中继日志中)。主服务器崩溃和故障转移到从服务器是无损 的,因为从服务器是最新的。

.使用AFTER_COMMIT,发出事务的客户端只有在服务器提交到存储引擎并收到从服务器的确认后才能获得返回状态。在提交之后,在slave确认之 前,其他客户端可以在提交之前看到已提交的事务。
如果出现问题,从服务器无法处理事务,那么在主服务器崩溃并故障转移到从服务器的情况下,这些客户端可能会看到相对于在主服务器上看到 的数据丢失。

半同步复制管理接口
半同步复制的管理接口有几个组件:
.两个插件实现了半同步功能。主端有一个插件,从端有一个插件。
.系统变量控制插件的行为。一些例子:
.rpl_semi_sync_master_enabled
控制是否在主服务器上启用半同步复制。要启用或禁用插件,请分别将该变量设置为1或0。默认值为0(关闭)。
.rpl_semi_sync_master_timeout
一个以毫秒为单位的值,用于控制主服务器在超时并恢复到异步复制之前等待从服务器确认提交的时间。缺省值是10000(10秒)。
.rpl_semi_sync_slave_enabled
类似于rpl_semi_sync_master_enabled,但是控制从属插件。
.状态变量启用半同步复制监控。一些例子:
.Rpl_semi_sync_master_clients
半同步从机的数量
.Rpl_semi_sync_master_status
主端上的半同步复制当前是否正在运行。如果插件已启用且未发生提交确认,则该值为1。如果插件未启用或主服务器由于提交确认超时而退回 到异步复制,则该值为0。
.Rpl_semi_sync_master_no_tx
从服务器未成功确认的提交数。
.Rpl_semi_sync_master_yes_tx
从服务器成功确认的提交数。
.Rpl_semi_sync_slave_status
从端是否正在进行半同步复制。如果插件已启用并且从I/O线程正在运行,则该值为1,否则为0。

系统变量和状态变量只有在使用install plugin安装了适当的主插件或从插件时才可用。

半同步复制是使用插件实现的,因此必须将插件安装到服务器中以使其可用。安装插件后,您可以通过与它关联的系统变量来控制它。在安装相 关插件之前,这些系统变量不可用。

下面介绍如何安装半同步复制插件
使用半同步复制,需要满足以下条件:
.必须安装MySQL 5.5或更高版本。

.安装插件的能力需要MySQL服务器支持动态加载。要验证这一点,请检查系统变量have_dynamic_loading的值是否为YES。二进制发行版应该支 持动态加载

mysql> show variables like 'have_dynamic_loading';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| have_dynamic_loading | YES   |
+----------------------+-------+
1 row in set (0.01 sec)

.复制必须已经在工作

.不能配置多个复制区域通道。半同步复制只兼容默认复制区域通道。

要设置半同步复制,请使用以下说明。这里提到的INSTALL PLUGIN、SET GLOBAL、STOP SLAVE和START SLAVE语句需要SUPER权限。

MySQL发行版包括主端和从端的半同步复制插件文件。

为了能够被主服务器或从服务器使用,适当的插件库文件必须位于MySQL插件目录中(由plugin_dir系统变量命名的目录)。如果有必要,在服 务器启动时设置plugin_dir的值,告诉服务器插件目录的位置。

插件库文件基名为semiync_master和semiync_slave。文件名后缀因平台而异(例如,Unix和类Unix系统为.so, Windows为.dll)。

主插件库文件必须存在于主服务器的插件目录中。从属插件库文件必须存在于每个从属服务器的插件目录中。

要加载插件,请在主服务器和每个半同步的从服务器上使用INSTALL PLUGIN语句(根据需要调整平台的。so后缀)。

主服务器:

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

Query OK, 0 rows affected (0.06 sec)

每个从服务器:

mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
Query OK, 0 rows affected (0.03 sec)

如果尝试在Linux上安装插件导致类似于下面所示的错误,你必须安装libimf:

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
ERROR 1126 (HY000): Can't open shared library
'/usr/local/mysql/lib/plugin/semisync_master.so'
(errno: 22 libimf.so: cannot open shared object file:
No such file or directory)

您可以从http://dev.mysql.com/downloads/os-linux.html获取libimf。

要查看安装了哪些插件,请使用SHOW PLUGINS语句,或查询INFORMATION_SCHEMA.PLUGINS表。

要验证插件安装,请检查INFORMATION_SCHEMA。PLUGINS表或使用SHOW PLUGINS语句。

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';
+----------------------+---------------+
| PLUGIN_NAME          | PLUGIN_STATUS |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE        |
+----------------------+---------------+
1 row in set (0.00 sec)

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';
+---------------------+---------------+
| PLUGIN_NAME         | PLUGIN_STATUS |
+---------------------+---------------+
| rpl_semi_sync_slave | ACTIVE        |
+---------------------+---------------+
1 row in set (0.00 sec)

如果插件初始化失败,请检查服务器错误日志以获取诊断消息。

安装了半同步复制插件后,默认情况下是禁用的。必须在主端和从端同时启用插件才能启用半同步复制。如果只启用了一方,复制将是异步的。

要控制是否启用已安装的插件,请设置适当的系统变量。您可以在运行时使用SET GLOBAL设置这些变量,或者在服务器启动时在命令行或选项文 件中设置这些变量。

在运行时,这些主端系统变量是可用的:

SET GLOBAL rpl_semi_sync_master_enabled = {0|1};
SET GLOBAL rpl_semi_sync_master_timeout = N;

在从属端,这个系统变量是可用的:

SET GLOBAL rpl_semi_sync_slave_enabled = {0|1};

主服务器:

mysql> SET GLOBAL rpl_semi_sync_master_enabled =1;
Query OK, 0 rows affected (0.00 sec)

mysql> SET GLOBAL rpl_semi_sync_master_timeout =1000;
Query OK, 0 rows affected (0.00 sec)

从服务器:

mysql> SET GLOBAL rpl_semi_sync_slave_enabled =1;
Query OK, 0 rows affected (0.01 sec)

对于rpl_semi_sync_master_enabled或rpl_semi_sync_slave_enabled,取值为1表示开启半同步复制,取值为0表示关闭半同步复制。默认情况 下,这些变量被设置为0。

对于rpl_semi_sync_master_timeout,值N以毫秒为单位给出。缺省值是10000 (10秒)。

如果在运行时在从服务器上启用半同步复制,还必须启动从服务器I/O线程 (如果它已经在运行,首先停止它),使从服务器连接到主服务器, 并注册为半同步从服务器:
从服务器:

mysql> STOP SLAVE IO_THREAD;
Query OK, 0 rows affected (0.00 sec)

mysql> START SLAVE IO_THREAD;
Query OK, 0 rows affected (0.00 sec)

主服务器日志:

2024-12-20T08:06:51.512468Z 158 [Note] Stop asynchronous binlog_dump to slave (server_id: 3)
2024-12-20T08:06:51.512514Z 160 [Note] Start binlog_dump to master_thread_id(160) slave_server(3), pos(binlog.000010, 1539)
2024-12-20T08:06:51.512665Z 160 [Note] Start semi-sync binlog_dump to slave (server_id: 3), pos(binlog.000010, 1539)

从服务器日志:

2024-12-16T16:34:53.943377Z 29 [Note] Aborted connection 29 to db: 'jycs' user: 'root' host: 'localhost' (Got timeout reading  communication packets)
2024-12-20T07:57:17.825164Z 37 [Note] Slave I/O thread killed while reading event for channel ''
2024-12-20T07:57:17.825246Z 37 [Note] Slave I/O thread exiting for channel '', read up to log 'binlog.000010', position 1539
2024-12-20T07:57:34.529684Z 40 [Note] Slave I/O thread: Start semi-sync replication to master 'repl@10.138.130.243:3306' in  log 'binlog.000010' at position 1539
2024-12-20T07:57:34.529748Z 40 [Warning] Storing MySQL user name or password information in the master info repository is not  secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see  the 'START SLAVE Syntax' in the MySQL Manual for more information.
2024-12-20T07:57:42.404410Z 40 [Note] Slave I/O thread for channel '': connected to master  'repl@10.138.130.243:3306',replication started in log 'binlog.000010' at position 1539

如果I/O线程已经在运行,而您没有重新启动它,从服务器将继续使用异步复制。
在服务器启动时,可以将控制半同步复制的变量设置为命令行选项或选项文件。选项文件中列出的设置在每次服务器启动时生效。例如,您可以 在主端和从端my.cnf文件中设置如下变量。
主服务器:

[mysql@localhost mysql]$ vi my.cnf
......
[mysqld]
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000 # 1 second

从服务器:

[mysql@localhost mysql]$ vi my.cnf
......
[mysqld]
rpl_semi_sync_slave_enabled=1

半同步复制监控
用于半同步复制功能的插件公开了几个系统和状态变量,您可以检查这些变量以确定其配置和操作状态。

系统变量反映了如何配置半同步复制。要查看它们的值,请使用show variables:
主服务器:

mysql> show variables like 'rpl_semi_sync%';
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | ON         |
| rpl_semi_sync_master_timeout              | 1000       |
| rpl_semi_sync_master_trace_level          | 32         |
| rpl_semi_sync_master_wait_for_slave_count | 1          |
| rpl_semi_sync_master_wait_no_slave        | ON         |
| rpl_semi_sync_master_wait_point           | AFTER_SYNC |
+-------------------------------------------+------------+
6 rows in set (0.01 sec)

从服务器:

mysql> show variables like 'rpl_semi_sync%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | ON    |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+
2 rows in set (0.01 sec)

通过状态变量,可以监控半同步复制的运行情况。要查看它们的值,使用show status:
主服务器:

mysql> show status like 'rpl_semi_sync%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 1     |
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 1     |
| Rpl_semi_sync_master_no_times              | 0     |
| Rpl_semi_sync_master_no_tx                 | 0     |
| Rpl_semi_sync_master_status                | ON    |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 1507  |
| Rpl_semi_sync_master_tx_wait_time          | 1507  |
| Rpl_semi_sync_master_tx_waits              | 1     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 1     |
+--------------------------------------------+-------+
14 rows in set (0.00 sec)

从服务器:

mysql> show status like 'rpl_semi_sync%';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON    |
+----------------------------+-------+
1 row in set (0.01 sec)

当主服务器由于提交阻塞超时或从服务器追赶而在异步或半同步复制之间切换时,它会适当地设置Rpl_semi_sync_master_status状态变量的值 。在主服务器上从半同步复制自动回退到异步复制意味着,即半同步复制实际上目前没有运行,rpl_semi_sync_master_enabled系统变量在主服 务器端的值也可能为1。可以监视Rpl_semi_sync_master_status状态变量,以确定主服务器当前使用的是异步复制还是半同步复制。

要查看连接了多少个半同步从服务器,请检查Rpl_semi_sync_master_clients。

Rpl_semi_sync_master_yes_tx和Rpl_semi_sync_master_no_tx变量表示从服务器成功或不成功确认的提交数量。

从服务器上的Rpl_semi_sync_slave_status表示半同步复制当前是否处于运行状态。

MySQL 5.7 禁用GTID联机事务

在线禁用GTID事务
如何在已经在线的服务器上禁用GTID事务。此过程不需要使服务器离线,适合在生产环境中使用。但是,如果您有可能在禁用GTIDs模式时 使服务器离线,那么这个过程会更容易。

该过程类似于在服务器在线时启用GTID事务,但步骤相反。唯一不同的是等待已记录事务复制的时间点。

在开始之前,请确保服务器满足以下前提条件:
.拓扑中的所有服务器必须使用MySQL 5.7.6或更高版本。您不能在任何一台服务器上在线禁用GTID事务,除非拓扑中的所有服务器都使用此版本 。

.所有服务器都将gtid_mode设置为ON。

1.在每个从服务器上执行以下命令,如果您使用多源复制,请为每个通道执行此操作,并包含for channel channel子句:

STOP SLAVE [FOR CHANNEL 'channel'];
CHANGE MASTER TO MASTER_AUTO_POSITION = 0, MASTER_LOG_FILE = file,MASTER_LOG_POS = position [FOR CHANNEL 'channel'];
START SLAVE [FOR CHANNEL 'channel'];


mysql> stop slave for channel 'master-1';
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> stop slave for channel 'master-2';
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> CHANGE MASTER TO MASTER_AUTO_POSITION = 0, MASTER_LOG_FILE ='binlog.000008',MASTER_LOG_POS=194 for channel 'master-1';
Query OK, 0 rows affected (0.01 sec)

mysql> CHANGE MASTER TO MASTER_AUTO_POSITION = 0, MASTER_LOG_FILE ='binlog.000007',MASTER_LOG_POS=194 for channel 'master-2';
Query OK, 0 rows affected (0.00 sec)

mysql> start slave for channel 'master-1';
Query OK, 0 rows affected (0.00 sec)

mysql> start slave for channel 'master-2';
Query OK, 0 rows affected (0.00 sec)

2.在每个服务器上执行:

SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;

mysql> SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;
Query OK, 0 rows affected (0.01 sec)

3.在每个服务器上执行:

SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;

mysql> SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;
Query OK, 0 rows affected (0.03 sec)

4.在每个服务器上,等待变量@@GLOBAL。GTID_OWNED等于空字符串。可以使用以下命令检查:

mysql> SELECT @@GLOBAL.GTID_OWNED;
+---------------------+
| @@GLOBAL.GTID_OWNED |
+---------------------+
|                     |
+---------------------+
1 row in set (0.00 sec)

在复制从机上,从理论上讲,它可能是空的,然后又变为非空的。这不是问题,空一次就足够了。

5.等待当前存在于任何二进制日志中的所有事务复制到所有从属日志
1.在主服务器执行:

SHOW MASTER STATUS;

主库1:10.18.30.50

mysql> SHOW MASTER STATUS;
+---------------+----------+--------------+------------------+-------------------------------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                         |
+---------------+----------+--------------+------------------+-------------------------------------------+
| binlog.000010 |      194 |              |                  | bb8b95d1-6f47-11ef-9592-005056a390e6:1-10 |
+---------------+----------+--------------+------------------+-------------------------------------------+
1 row in set (0.00 sec)


主库2:10.18.30.43

mysql> SHOW MASTER STATUS;
+---------------+----------+--------------+------------------+-------------------------------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                         |
+---------------+----------+--------------+------------------+-------------------------------------------+
| binlog.000009 |      194 |              |                  | 684e1f7d-6f47-11ef-a6d5-005056a3a162:1-11 |
+---------------+----------+--------------+------------------+-------------------------------------------+
1 row in set (0.00 sec)

记下“文件和位置”列中的值

2.在每个从属服务器上,使用来自主服务器的文件和位置信息执行:

SELECT MASTER_POS_WAIT('source_log_file', source_log_pos [, timeout][, channel])

从库:10.18.30.39

mysql> SELECT MASTER_POS_WAIT('binlog.000010',194,0,'master-1');
+---------------------------------------------------+
| MASTER_POS_WAIT('binlog.000007',194,0,'master-1') |
+---------------------------------------------------+
|                                                 0 |
+---------------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT MASTER_POS_WAIT('binlog.000009',194,0,'master-2');
+---------------------------------------------------+
| MASTER_POS_WAIT('binlog.000006',194,0,'master-2') |
+---------------------------------------------------+
|                                                 0 |
+---------------------------------------------------+
1 row in set (0.00 sec)

返回值为0 ,代表从库已经应用了主库1binlog.000010 194与 主库2binlog.000009 194位置的数据。

如果有一个主服务器和多层的从服务器,或者换句话说,有从服务器的从服务器,那么在每层都重复第2步,从主服务器开始,然后是所有的直 接从服务器,然后是所有从服务器的从服务器,以此类推。

6.如果您将二进制日志用于复制以外的其他用途,例如执行时间点备份或恢复:请等到不需要具有GTID事务的旧二进制日志时再使用。

例如,在步骤5完成之后,可以在进行备份的服务器上执行FLUSH LOGS。然后,要么显式地进行备份,要么等待您可能设置的任何定期备份例程 的下一次迭代。

理想情况下,等待服务器清除步骤5完成时存在的所有二进制日志。还要等待步骤5之前所做的备份过期。

这是整个过程中最重要的一点。重要的是要理解,包含GTID事务的日志在下一步之后不能使用。在继续之前,必须确保GTID事务不存在于拓扑中 的任何位置。

7.在每个服务器上执行:

mysql> SET @@GLOBAL.GTID_MODE = OFF;
Query OK, 0 rows affected (0.01 sec)

8.在每个服务器上,在my.cnf文件中设置gtid-mode=OFF
如果你想设置enforce_gtid_consistency=OFF,现在就可以这样做。设置好后,你应该在你的配置文件中添加enforce_gtid_consistency=OFF。

如果您想降级到MySQL的早期版本,现在就可以这样做,使用正常的降级过程。