环境
- 系统: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-master
和mysql-slave
。
主库配置安装
在mysql-master
文件夹下新建数据文件夹data
和配置文件my.ini
。
my.ini内容如下:
[mysqld]
# 服务器ID
server-id=1
# 设置3306端口
port=3306
# 设置mysql的安装目录
basedir=D:\mysql-master
# 设置mysql数据库的数据的存放目录
datadir=D:\mysql-master\data
# 允许最大连接数
max_connections=2048
# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=100
# 服务端使用的字符集默认为UTF8
character-set-server=utf8mb4
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8mb4
然后cmd
进入D://mysql-master//bin
文件下,执行相关数据库创建脚本
a.初始化数据库
mysqld --initialize --console
b.安装MySQL的Windows服务
mysqld install MySQL
c.启动MySQL的Windows服务
net start MySQL
全部脚本如下
Dmysql-masterbinmysqld --initialize --console
2019-05-16T042905.557091Z 0 [System] [MY-013169] [Server] Dmysql-masterbinmysqld.exe (mysqld 8.0.16) initializing of server in progress as process 6788
2019-05-16T042927.927342Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost kC-t+pB,47
2019-05-16T042936.050461Z 0 [System] [MY-013170] [Server] Dmysql-masterbinmysqld.exe (mysqld 8.0.16) initializing of server has completed
Dmysql-masterbinmysqld install MySQL
Service successfully installed.
Dmysql-masterbinnet start MySQL
MySQL 服务正在启动 ...
MySQL 服务已经启动成功
从库配置安装
在mysql-slave
文件夹下新建数据文件夹data
和配置文件my.ini
。
my.ini内容如下:
[mysqld]
# 服务器ID
server-id=2
# 设置3306端口
port=3307
# 设置mysql的安装目录
basedir=D:\mysql-slave
# 设置mysql数据库的数据的存放目录
datadir=D:\mysql-slave\data
# 允许最大连接数
max_connections=2048
# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=100
# 服务端使用的字符集默认为UTF8
character-set-server=utf8mb4
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3307
default-character-set=utf8mb4
重要的不同点就是server-id
和port
,主库和从库的server-id
一定是要不同,因为本次实验是在同一台主机上的所以port
端口号的值也要不同。
然后cmd
进入D:\mysql-slave\bin
文件下,执行相关数据库创建脚本
a.初始化MySQL从库
mysqld --initialize --console
b.安装MySQL从库的Windows服务
mysqld install MySQL2
c.启动MySQL从库的Windows服务
net start MySQL2
全部脚本如下
mysqld.exe --initialize --console
2019-05-16T054852.398955Z 0 [System] [MY-013169] [Server] Dmysql-slavebinmysqld.exe (mysqld 8.0.16) initializing of server in progress as process 7596
2019-05-16T054914.934147Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost PjeLMhvjK2t
2019-05-16T054923.777319Z 0 [System] [MY-013170] [Server] Dmysql-slavebinmysqld.exe (mysqld 8.0.16) initializing of server has completed
mysqld install MySQL2
Service successfully installed.
net start MySQL2
MySQL2 服务正在启动 ...
MySQL2 服务已经启动成功。
可以看到数据库root用户的初始密码为PjeLMhvjK2t
主从配置
主节点(master)配置
创建用户
#进入mysql
use mysql;
#创建用于复制操作的用户
create user 'test123'@'192.168.1.48' identified with mysql_native_password by 'test123';
#授权
GRANT REPLICATION SLAVE ON *.* TO 'test123'@'192.168.1.48';
#刷新授权表信息
FLUSH PRIVILEGES;
锁住主库,使其只能读不能写数据
flush tables with read lock;
获取主库当前binary log文件名和位置(position)
use mysql;
SHOW MASTER STATUS;
执行结果
+---------------+----------+--------------+------------------+-------------------+
File Position Binlog_Do_DB Binlog_Ignore_DB Executed_Gtid_Set
+---------------+----------+--------------+------------------+-------------------+
binlog.000001 1255
+---------------+----------+--------------+------------------+-------------------+
File
的值就是下面在从表操作时,设置主节点的master_log_file
要设置的值。
备份数据库
mysqldump -uroot -p123456 testdb > c:\\20090219.sql
从节点(slave)配置
创建数据库
create database testdb
还原数据库
mysql -uroot -p123456 testdb < c:\\20090219.sql
同步主库设置
use mysql;
#在从(Slave)库上设置主节点参数
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;
#开启主从同步
start slave;
#再查看主从同步状态
show slave status;
主节点解锁
# 解锁
unlock tables;
主要看Slave_IO_Running
和 Slave_SQL_Running
这两个字段的值,如果都是yes
,则同步成功。
问题
Slave failed to initialize relay log info structure from the repository
错误异常
mysql> start slave;
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的值
mysql> reset slave;
mysql> change master to ......
mysql> start slave;
主库创建表后,从库状态168 异常
Error ‘Got error 168 - ‘Unknown (generic) error from engine’ from storage engine’
原因分析
解决方法
在数据库配置文件里添加以下数据库引擎和字段字符集的默认配置
[mysqld]
# 服务端使用的字符集默认为UTF8
character-set-server=utf8mb4
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB