安装
- zip 下载入口
MySQL :: Download MySQL Community Serverhttps://dev.mysql.com/downloads/mysql/
- msi 下载入口
MySQL :: Download MySQL Installerhttps://dev.mysql.com/downloads/installer/
主库安装文件说明
两种下载格式,傻瓜式安装选择 msi,高端式安装选择 zip。我用了傻瓜式安装 msi,无需多言一顿操作猛如虎。安装好之后,请在自己选择的安装路径下找对应的安装目录。例如我是 C 盘 C:\Program Files\MySQL 如下 (MySQL Server 8.0 Slave 文件为从库,后面解释)
其中 MySQL Server 8.0 是 msi 安装之后生成的文件,如果你进入文件会发现,没有所谓的 my.ini 或者 my.cnf 包括 Data 和 Uploads 文件, 这是因为 MySQL 自 8.0 之后,生成的这些都在一个隐藏的文件夹下。
系统C盘 - 文件 - 更改文件夹和搜索选项 - 查看 - 显示隐藏的文件、文件夹和驱动器。选中应用
然后就会发现在系统C盘根目录下多了几个隐藏的文件,其中我们要找的MySQL安装之后生成的 my.ini 和 Data 文件等就在这里,C:\ProgramData\MySQL 如下(MySQL Server 8.0 Slave 文件为从库,后面解释)
对应的 my.ini 和 Data 、Uploads 文件都在这里了,有些网友所说的什么 MySQL 8 之后没有这部分文件应该是查找方式不对。这里特别说明是有的哈。修改主库配置如下(修改之后别忘重启数据库)
#主库配置
[mysqld]
#MySQL数据库标识示例[要唯一性]
server-id=1
#MySQL主-中继日志开启二进制日志
log_bin=master-bin
log_bin-index=master-bin.index
从库配置服务启动
直接在系统 C 盘下复制一份已经安装好的 MySQL 文件保持目录同步就好,就如上我截图所示,我复制了一份并且命名为 MySQL Server 8.0 Slave ,需要注意的是要在两个地方都复制一份出来。
- 系统文件目录:C:\Program Files\MySQL 来一份 MySQL Server 8.0 Slave (安装目录)
- 隐藏文件目录:C:\ProgramData\MySQL 来一份 MySQL Server 8.0 Slave (数据目录)
MySQL Server 8.0 Slave 就是我们要安装配置的从库,因为是复制过来的,所以需要先改配置在安装启动。其中端口建议直接 Ctrl+F 全部替换为 3305 大概有3处(我设置的从库用的是3305端口,本来想用 3307的,是因为 ShardingSphere-Proxy 默认的端口为 3307 所以就用了 3305)
#从库配置
[mysqld]
#端口
port=3305
#MySQL安装目录
basedir="C:/Program Files/MySQL/MySQL Server 8.0 Slave/"
#MySQL数据存放日志存放目录
datadir=C:/ProgramData/MySQL/MySQL Server 8.0 Slave/Data
#MySQL默认存储引擎
default-storage-engine=INNODB
#MySQL数据库标识示例[要唯一性]
server-id=2
#MySQL从-中继日志开启二进制日志
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin
保存之后,请务必以管理员方式进入 CMD (管理员方式进入、管理员方式进入、管理员方式进入,重要的事情说三遍)进入到安装目录的 bin 文件下,执行
mysqld --initialize --user=mysql --console
然后在进行服务注册,其中 MySQL80SLAVE 是注册的服务可以自己定义
mysqld install MySQL80SLAVE --defaults-file="C:\ProgramData\MySQL\MySQL Server 8.0 slave\my.ini"
执行到这一步,其实就可以通过系统服务去看MySQL服务有两个了,当然了我的两个都是启动状态下的,如下
如果执行完上面命令没有启动,可以手动启动或者命令行启动都可以。这样主库以 3306 为端口的和从库以 3305 为端口的数据库全部启动好了。
#启动命令
net start MySQL80SLAVE
#登录MySQL
mysql -P3305 -u root -p
#输入密码(一般是和你的3306密码一致的)
Enter password: ******
主从同步
- 主库3306端口登录查看
- 中间件3307端口登录查看(ShardingSphere-Proxy中间件)
- 从库3305端口登录查看
如上三个都已经正常启动并且可以登录进入对应端口的数据库了,下面我们开始配置 3306 和 3305 的主从同步。
主库
主库,创建对应的从库连接账号,如下
--- 用户名为slave,密码为123456,的用户
CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
--- 用户授权
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
--- 权限刷新
flush privileges;
主库查询用户是否创建,并查询对应的 MASTER_LOG_FILE 和 MASTER_LOG_POS 值设置从库的主从同步,如下
mysql> select user,host from mysql.user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| root | % |
| sharding | % |
| slave | % |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
+------------------+-----------+
6 rows in set (0.01 sec)
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000014 | 26897 | | | |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql>
从库
从库,执行设置同步主库的节点参数。SQL 中的 MASTER_LOG_FILE 就是在主库执行 show master status 查询出来的 File 字段值,而 MASTER_LOG_POS 对应的是查询出来的 Position 字段值
CHANGE MASTER TO
MASTER_HOST='127.0.0.1',
MASTER_PORT=3306,
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='master-bin.000014',
MASTER_LOG_POS=26897;
开启主从同步
start slave;
关闭主从同步
stop slave;
查看主从同步状态
show slave status \G
如上命令执行后,Slave_IO_Running: Yes 和 Slave_SQL_Running: Yes 都为 Yes 才标识主从同步才开启成功。如下请参考。如有其他问题欢迎留言讨论。
mysql> show slave status \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for source to send event
Master_Host: 127.0.0.1
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000014
Read_Master_Log_Pos: 3353
Relay_Log_File: slave-relay-bin.000002
Relay_Log_Pos: 325
Relay_Master_Log_File: master-bin.000014
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: 3353
Relay_Log_Space: 534
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: 1
Master_UUID: 1282ac0e-4a79-11eb-9ef0-94e6f7af5158
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Replica 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:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
Master_public_key_path:
Get_master_public_key: 0
Network_Namespace:
1 row in set, 1 warning (0.01 sec)
mysql>
如上全部执行成功之后,在PHP项目中的数据库连接直接改成 ShardingSphere-Proxy 连接信息,在对应执行 CURD 的时候,就会发现所有数据都在 3306 和 3305 里面生成和同步,实现主从同步。
欢迎小伙伴留言讨论