环境

  • 系统:Windows 10
  • MySQL版本:mysql-8.0.16-winx64.zip

    数据库安装

    数据库主要配置

    | Role | Host | Port | Service Name | Server ID | | —- | —- | —- | —- | —- | | 主 | 192.168.1.48 | 3306 | MySQL | 1 | | 从 | 192.168.1.48 | 3307 | MySQL2 | 2 |

下载解压

官网下载mysql-8.0.16-winx64.zip文件,分别解压两份到D盘,一个master数据库,一个slave数据库。文件夹重命名mysql-mastermysql-slave

主库配置安装

mysql-master文件夹下新建数据文件夹data和配置文件my.ini
my.ini内容如下:

  1. [mysqld]
  2. # 服务器ID
  3. server-id=1
  4. # 设置3306端口
  5. port=3306
  6. # 设置mysql的安装目录
  7. basedir=D:\mysql-master
  8. # 设置mysql数据库的数据的存放目录
  9. datadir=D:\mysql-master\data
  10. # 允许最大连接数
  11. max_connections=2048
  12. # 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
  13. max_connect_errors=100
  14. # 服务端使用的字符集默认为UTF8
  15. character-set-server=utf8mb4
  16. # 创建新表时将使用的默认存储引擎
  17. default-storage-engine=INNODB
  18. # 默认使用“mysql_native_password”插件认证
  19. default_authentication_plugin=mysql_native_password
  20. [mysql]
  21. # 设置mysql客户端默认字符集
  22. default-character-set=utf8mb4
  23. [client]
  24. # 设置mysql客户端连接服务端时默认使用的端口
  25. port=3306
  26. default-character-set=utf8mb4

然后cmd进入D://mysql-master//bin文件下,执行相关数据库创建脚本

a.初始化数据库

  1. mysqld --initialize --console

b.安装MySQL的Windows服务

  1. mysqld install MySQL

c.启动MySQL的Windows服务

  1. net start MySQL

全部脚本如下

  1. Dmysql-masterbinmysqld --initialize --console
  2. 2019-05-16T042905.557091Z 0 [System] [MY-013169] [Server] Dmysql-masterbinmysqld.exe (mysqld 8.0.16) initializing of server in progress as process 6788
  3. 2019-05-16T042927.927342Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost kC-t+pB,47
  4. 2019-05-16T042936.050461Z 0 [System] [MY-013170] [Server] Dmysql-masterbinmysqld.exe (mysqld 8.0.16) initializing of server has completed
  5. Dmysql-masterbinmysqld install MySQL
  6. Service successfully installed.
  7. Dmysql-masterbinnet start MySQL
  8. MySQL 服务正在启动 ...
  9. MySQL 服务已经启动成功

可以看到数据库root用户的初始密码为kC-t+pB,47

从库配置安装

mysql-slave文件夹下新建数据文件夹data和配置文件my.ini
my.ini内容如下:

  1. [mysqld]
  2. # 服务器ID
  3. server-id=2
  4. # 设置3306端口
  5. port=3307
  6. # 设置mysql的安装目录
  7. basedir=D:\mysql-slave
  8. # 设置mysql数据库的数据的存放目录
  9. datadir=D:\mysql-slave\data
  10. # 允许最大连接数
  11. max_connections=2048
  12. # 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
  13. max_connect_errors=100
  14. # 服务端使用的字符集默认为UTF8
  15. character-set-server=utf8mb4
  16. # 创建新表时将使用的默认存储引擎
  17. default-storage-engine=INNODB
  18. # 默认使用“mysql_native_password”插件认证
  19. default_authentication_plugin=mysql_native_password
  20. [mysql]
  21. # 设置mysql客户端默认字符集
  22. default-character-set=utf8mb4
  23. [client]
  24. # 设置mysql客户端连接服务端时默认使用的端口
  25. port=3307
  26. default-character-set=utf8mb4

重要的不同点就是server-idport,主库和从库的server-id一定是要不同,因为本次实验是在同一台主机上的所以port端口号的值也要不同。

然后cmd进入D:\mysql-slave\bin文件下,执行相关数据库创建脚本

a.初始化MySQL从库

  1. mysqld --initialize --console

b.安装MySQL从库的Windows服务

  1. mysqld install MySQL2

c.启动MySQL从库的Windows服务

  1. net start MySQL2

全部脚本如下

  1. mysqld.exe --initialize --console
  2. 2019-05-16T054852.398955Z 0 [System] [MY-013169] [Server] Dmysql-slavebinmysqld.exe (mysqld 8.0.16) initializing of server in progress as process 7596
  3. 2019-05-16T054914.934147Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost PjeLMhvjK2t
  4. 2019-05-16T054923.777319Z 0 [System] [MY-013170] [Server] Dmysql-slavebinmysqld.exe (mysqld 8.0.16) initializing of server has completed
  5. mysqld install MySQL2
  6. Service successfully installed.
  7. net start MySQL2
  8. MySQL2 服务正在启动 ...
  9. MySQL2 服务已经启动成功。

可以看到数据库root用户的初始密码为PjeLMhvjK2t

主从配置

主节点(master)配置

创建用户

  1. #进入mysql
  2. use mysql;
  3. #创建用于复制操作的用户
  4. create user 'test123'@'192.168.1.48' identified with mysql_native_password by 'test123';
  5. #授权
  6. GRANT REPLICATION SLAVE ON *.* TO 'test123'@'192.168.1.48';
  7. #刷新授权表信息
  8. FLUSH PRIVILEGES;

锁住主库,使其只能读不能写数据

  1. flush tables with read lock;

获取主库当前binary log文件名和位置(position)

  1. use mysql;
  2. SHOW MASTER STATUS;

执行结果

  1. +---------------+----------+--------------+------------------+-------------------+
  2. File Position Binlog_Do_DB Binlog_Ignore_DB Executed_Gtid_Set
  3. +---------------+----------+--------------+------------------+-------------------+
  4. binlog.000001 1255
  5. +---------------+----------+--------------+------------------+-------------------+

File的值就是下面在从表操作时,设置主节点的master_log_file要设置的值。

备份数据库

  1. mysqldump -uroot -p123456 testdb > c:\\20090219.sql

从节点(slave)配置

创建数据库

  1. create database testdb

还原数据库

  1. mysql -uroot -p123456 testdb < c:\\20090219.sql

同步主库设置

  1. use mysql;
  2. #在从(Slave)库上设置主节点参数
  3. change master to master_host='192.168.1.48',master_port=3306,master_user='test123',master_password='test123',master_log_file='binlog.000001',master_log_pos=0;
  4. #开启主从同步
  5. start slave;
  6. #再查看主从同步状态
  7. show slave status;

主节点解锁

  1. # 解锁
  2. unlock tables;

主要看Slave_IO_RunningSlave_SQL_Running这两个字段的值,如果都是yes,则同步成功。

问题

Slave failed to initialize relay log info structure from the repository

错误异常

  1. mysql> start slave;
  2. ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository

解决方法

slave reset执行候做了这样几件事:
1、删除slave_master_info ,slave_relay_log_info两个表中数据;
2、删除所有relay log文件,并重新创建新的relay log文件;
3、不会改变gtid_executed 或者 gtid_purged的值

  1. mysql> reset slave;
  2. mysql> change master to ......
  3. mysql> start slave;

主库创建表后,从库状态168 异常

Error ‘Got error 168 - ‘Unknown (generic) error from engine’ from storage engine’

原因分析

创建的表没有指明表引擎,从节点无法执行相关的建表语句

解决方法

在数据库配置文件里添加以下数据库引擎和字段字符集的默认配置

  1. [mysqld]
  2. # 服务端使用的字符集默认为UTF8
  3. character-set-server=utf8mb4
  4. # 创建新表时将使用的默认存储引擎
  5. default-storage-engine=INNODB