20180521 改用 GTID 方式 完成mysql M/S 主从复制
1、环境
Winoidws Server R2 2008
护卫神套件安装
1、PHP 7.0.5(FastCGI)
2、MySQL 5.6.14(MyISAM)
3、MyODBC 5.2.6
4、PhpMyAdmin 4.0.6
5、MySQL密码重置工具
** Master(主)服务器: 192。168。0。188
** Slave(从)服务器: 192。168。0。189
** 我努力学习了 mysql M/S 基于bin log 方式主从复制之后,改用 GTID 方式
本文先不包括 Master(主)服务器 配置复制用户 slave 以及权限部分
** 待补充 基于bin log 方式主从复制
2、准备动作
1)设置 mysql 命令行方式
** 操作过程中经常需要开启 2 个串口,1 个命令行,一个 PhpMyAdmin(或者 Navicat)
2)学习掌握最基础的几个命令(在以上说到的命令行窗口操作)
重启 mysql 服务
我直接使用 "任务管理器" 找到 mysql 服务,选择"停止服务"和"启动服务"
启动 mysql 命令行
mysql -hlocalhost -uroot -p123456
确认 Master(主)服务器的 复制账号正确连接(假设榕湖名:slave 密码:123456)
mysql -h192.168.0.188 -uslave -pdhbm*20140729
备份(导出)数据库(假设榕湖名:root 密码:123456 主要复制数据库名:zjbr168)
单独备份
mysqldump -uroot -p123456 --databases zjbr168 >d:\\test\\wzh0180521.sql
备份全部
mysqldump -uroot -p123456 --all-databases >d:\test\wzh018052101.sql
还原(导入)数据库
在 mysql 命令行
单个导入还原
mysql> use zjbr168
source d:\\test\\wzh0180521.sql;
全部导入还原
source d:\\test\\wzh018052101.sql;
停止 Slave 服务
mysql> stop slave;
切换到 Master 的 slave 身份连接,进入 GTID 复制
change master to master_host='192.168.0.188',master_user='slave',master_password='123456', MASTER_AUTO_POSITION = 1;
开启 Slave 服务
mysql> start slave;
查看 Master 状态
mysql> show master status;
查看 Slave 状态
mysql> show slave status\G;
阻止 write 操作
mysql> FLUSH TABLES WITH READ LOCK;
开启 write 操作
mysql> UNLOCK TABLES;
3)掌握最基础的 SQL 命令 (以下在 PhpMyAdmin 窗口操作)
建立新数据库
CREATE DATABASE `zjbr168`;
切换数据库
USE `zjbr168`;
删除数据库
DROP TABLE IF EXISTS `test1`;
建立新 table
CREATE TABLE `test` (
`test` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert 记录
INSERT INTO `test1` VALUES ('6660521');
** 主要用于确认是否同步复制,所以,建立一个最简单的 table,插入一条最简单的记录
3、准备工作遇到错误
mysqldump命令备份master的全部数据库遇到错误,提示 'innodb_index_stats' doesn't exist
参考 https://stackoverflow.com/questions/37856155/mysql-upgrade-failed-innodb-tables-doesnt-exist
原来是 这 5 个表有问题
1)innodb_index_stats
2)innodb_table_stats
3)slave_master_info
4)slave_relay_log_info
5)slave_worker_info
为了防止以上连接打不开,我抄写一下(抱歉)
1)Drop 掉以上 5 个 table,发现有错误,先去进行下一步 2)
Drop table innodb_index_stats
Drop table innodb_table_stats
Drop table slave_master_info
Drop table slave_relay_log_info
Drop table slave_worker_info
2)按照原文建议,找到 Delete *.frm and *.ibd
** 我这里的位置在 D:\Huweishen.com\PHPWEB\MySQL Server 5.6\data\mysql
3)重新 create 以上 5 个 table
CREATE TABLE `innodb_index_stats` (
`database_name` varchar(64) COLLATE utf8_bin NOT NULL,
`table_name` varchar(64) COLLATE utf8_bin NOT NULL,
`index_name` varchar(64) COLLATE utf8_bin NOT NULL,
`last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`stat_name` varchar(64) COLLATE utf8_bin NOT NULL,
`stat_value` bigint(20) unsigned NOT NULL,
`sample_size` bigint(20) unsigned DEFAULT NULL,
`stat_description` varchar(1024) COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`database_name`,`table_name`,`index_name`,`stat_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin STATS_PERSISTENT=0;
CREATE TABLE `innodb_table_stats` (
`database_name` varchar(64) COLLATE utf8_bin NOT NULL,
`table_name` varchar(64) COLLATE utf8_bin NOT NULL,
`last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`n_rows` bigint(20) unsigned NOT NULL,
`clustered_index_size` bigint(20) unsigned NOT NULL,
`sum_of_other_index_sizes` bigint(20) unsigned NOT NULL,
PRIMARY KEY (`database_name`,`table_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin STATS_PERSISTENT=0;
CREATE TABLE `slave_master_info` (
`Number_of_lines` int(10) unsigned NOT NULL COMMENT 'Number of lines in the file.',
`Master_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'The name of the master binary log currently being read from the master.',
`Master_log_pos` bigint(20) unsigned NOT NULL COMMENT 'The master log position of the last read event.',
`Host` char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'The host name of the master.',
`User_name` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'The user name used to connect to the master.',
`User_password` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'The password used to connect to the master.',
`Port` int(10) unsigned NOT NULL COMMENT 'The network port used to connect to the master.',
`Connect_retry` int(10) unsigned NOT NULL COMMENT 'The period (in seconds) that the slave will wait before trying to reconnect to the master.',
`Enabled_ssl` tinyint(1) NOT NULL COMMENT 'Indicates whether the server supports SSL connections.',
`Ssl_ca` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'The file used for the Certificate Authority (CA) certificate.',
`Ssl_capath` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'The path to the Certificate Authority (CA) certificates.',
`Ssl_cert` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'The name of the SSL certificate file.',
`Ssl_cipher` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'The name of the cipher in use for the SSL connection.',
`Ssl_key` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'The name of the SSL key file.',
`Ssl_verify_server_cert` tinyint(1) NOT NULL COMMENT 'Whether to verify the server certificate.',
`Heartbeat` float NOT NULL,
`Bind` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'Displays which interface is employed when connecting to the MySQL server',
`Ignored_server_ids` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'The number of server IDs to be ignored, followed by the actual server IDs',
`Uuid` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'The master server uuid.',
`Retry_count` bigint(20) unsigned NOT NULL COMMENT 'Number of reconnect attempts, to the master, before giving up.',
`Ssl_crl` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'The file used for the Certificate Revocation List (CRL)',
`Ssl_crlpath` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'The path used for Certificate Revocation List (CRL) files',
`Enabled_auto_position` tinyint(1) NOT NULL COMMENT 'Indicates whether GTIDs will be used to retrieve events from the master.',
PRIMARY KEY (`Host`,`Port`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 STATS_PERSISTENT=0 COMMENT='Master Information';
CREATE TABLE `slave_relay_log_info` (
`Number_of_lines` int(10) unsigned NOT NULL COMMENT 'Number of lines in the file or rows in the table. Used to version table definitions.',
`Relay_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'The name of the current relay log file.',
`Relay_log_pos` bigint(20) unsigned NOT NULL COMMENT 'The relay log position of the last executed event.',
`Master_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'The name of the master binary log file from which the events in the relay log file were read.',
`Master_log_pos` bigint(20) unsigned NOT NULL COMMENT 'The master log position of the last executed event.',
`Sql_delay` int(11) NOT NULL COMMENT 'The number of seconds that the slave must lag behind the master.',
`Number_of_workers` int(10) unsigned NOT NULL,
`Id` int(10) unsigned NOT NULL COMMENT 'Internal Id that uniquely identifies this record.',
PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 STATS_PERSISTENT=0 COMMENT='Relay Log Information';
CREATE TABLE `slave_worker_info` (
`Id` int(10) unsigned NOT NULL,
`Relay_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
`Relay_log_pos` bigint(20) unsigned NOT NULL,
`Master_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
`Master_log_pos` bigint(20) unsigned NOT NULL,
`Checkpoint_relay_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
`Checkpoint_relay_log_pos` bigint(20) unsigned NOT NULL,
`Checkpoint_master_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
`Checkpoint_master_log_pos` bigint(20) unsigned NOT NULL,
`Checkpoint_seqno` int(10) unsigned NOT NULL,
`Checkpoint_group_size` int(10) unsigned NOT NULL,
`Checkpoint_group_bitmap` blob NOT NULL,
PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 STATS_PERSISTENT=0 COMMENT='Worker Information';
4)重启 mysql,悲剧了!停止 mysql ok,但是,启动 mysql 不行了!
** 好在我执行 2 ) Delete *.frm and *.ibd 都放到了回收站
** 直接全部选中 *.frm and *.ibd ,还原,选择不覆盖 (刚才 drop/create 过程中,又新建了一些 .frm,ibd 文件)
** 再去启动 mysql ,ok了!
5)重新 mysqldump 备份全部数据库,ok!
4、开始设置 Master (主)服务器
1)、找到 my.ini,在 [mysqld]项目下加入一下设置
# add by wzh 20180521 for M/S GTID
#主库id
server-id=1
#开启gtid模式
gtid_mode=on
#强制gtid
enforce_gtid_consistency=on
#binlog
log_bin=master-binlog
log-slave-updates=1
binlog_format=row
#relay log
skip_slave_start=1
2)、重启 mysql
5、开始设置 Slave(从)服务器
1)、找到 my.ini,在 [mysqld]项目下加入一下设置
# add by wzh 20180521 for M/S GTID
#从库id
server-id=2
#GTID:
gtid_mode=on
enforce_gtid_consistency=on
#binlog
log-bin=slave-binlog
log-slave-updates=1
binlog_format=row
#relay log
skip_slave_start=1
2)、重启 mysql
6、开始准备数据
1)在 Master(主)服务器,阻止 write 操作
2)在 Master(主)服务器,导出备份全部数据库
3)ftp 或者复制以上备份到Slave(从)服务器
4)在 Slave(从)服务器 导入还原全部数据库
** 之前已经存在的同名数据库。同名table等数据,都会被 drop
7、开启Slave(从)服务器在线复制
1)启动 mysql 命令行
mysql -hlocalhost -uroot -p123456
2)停止 Slave 服务
mysql> stop slave;
3)切换到 Master 的 slave 身份连接,进入 GTID 复制
change master to master_host='192.168.0.188',master_user='slave',master_password='123456', MASTER_AUTO_POSITION = 1;
4)开启 Slave 服务
mysql> start slave;
5)查看 Slave 状态
mysql> show slave status\G;
重点关注以下 3 个
Slave_IO_State: Waiting for master to send event
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
8、验证:打开 2 个 phpadmin 串口
在 Master(主)服务器,找到 zjbr168 ,
INSERT INTO `test1` VALUES ('123456');
在 Slave(从)服务器 ,找到 zjbr168 ,看看 test1 里面是否增加了该记录