windows server 2008 mysql 5.6 主从复制(GTID 方式)实践

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 里面是否增加了该记录

猜你喜欢

转载自my.oschina.net/u/1440971/blog/1816116