安装

  • zip 下载入口

MySQL :: Download MySQL Community Server

mysql数据库需要读写分离_服务器

https://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数据库需要读写分离_mysql数据库需要读写分离_02

        其中 MySQL Server 8.0 是 msi 安装之后生成的文件,如果你进入文件会发现,没有所谓的 my.ini 或者 my.cnf 包括 Data 和 Uploads 文件, 这是因为 MySQL 自 8.0 之后,生成的这些都在一个隐藏的文件夹下。

系统C盘 - 文件 - 更改文件夹和搜索选项 -  查看 - 显示隐藏的文件、文件夹和驱动器。选中应用

mysql数据库需要读写分离_mysql数据库需要读写分离_03

mysql数据库需要读写分离_mysql数据库需要读写分离_04

mysql数据库需要读写分离_dba_05

        然后就会发现在系统C盘根目录下多了几个隐藏的文件,其中我们要找的MySQL安装之后生成的 my.ini 和 Data 文件等就在这里,C:\ProgramData\MySQL 如下(MySQL Server 8.0 Slave 文件为从库,后面解释)

mysql数据库需要读写分离_dba_06

mysql数据库需要读写分离_服务器_07

        对应的 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数据库需要读写分离_数据库_08

         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服务有两个了,当然了我的两个都是启动状态下的,如下

mysql数据库需要读写分离_mysql数据库需要读写分离_09

如果执行完上面命令没有启动,可以手动启动或者命令行启动都可以。这样主库以 3306 为端口的和从库以 3305 为端口的数据库全部启动好了。

#启动命令
net start MySQL80SLAVE
#登录MySQL
mysql -P3305 -u root -p
#输入密码(一般是和你的3306密码一致的)
Enter password: ******

主从同步

  • 主库3306端口登录查看

mysql数据库需要读写分离_dba_10

  • 中间件3307端口登录查看(ShardingSphere-Proxy中间件)

mysql数据库需要读写分离_服务器_11

  • 从库3305端口登录查看

mysql数据库需要读写分离_dba_12

        如上三个都已经正常启动并且可以登录进入对应端口的数据库了,下面我们开始配置 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数据库需要读写分离_dba_13

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 里面生成和同步,实现主从同步。

        欢迎小伙伴留言讨论