MySQL主从架构 5.7.32

5.7的最新版本
mysql-5.7.32-linux-glibc2.12-x86_64.tar.gz
地址:https://downloads.mysql.com/archives/community/

1.安装MySQL5.7.32

使用的主机:
192.168.2.164 master
192.168.2.165 slave

两台主机均需要安装

mysql必须装在系统最大分区

1、检查并卸载系统中低版本的mysql
# rpm -qa |grep mysql
# yum remove mysql mysql-server mysql-libs
# rpm -e mysql-libs-5.1.71-1.el6.x86_64 --nodeps

2添加用户和组:
添加用户和组,启动服务用mysql用户,后期维护也可以用mysql用户,如果后期不用mysql账户登录使用(useradd -r -g mysql mysql: -r表示系统用户,在这里不使用)
# groupadd mysql
# useradd -g mysql mysql -s /sbin/nologin
不用设置mysql用户密码

解压gz包并创建软连接
# tar -zxv -f mysql-5.7.32-linux-glibc2.12-x86_64.tar.gz -C /data
# cd /data/
# mv mysql-5.7.32-linux-glibc2.12-x86_64 mysql
# ln -sv /data/mysql /usr/local/mysql 
# cd /usr/local/mysql(这一步没必要操作)
3创建目录及授权
可以写一个shell脚本批量执行这些命令

/etc/my.cnf配置文件中的路径要跟这些路径保持一致

# mkdir -pv /data/mysql/data  
# mkdir -pv /data/mysql/dblog/iblog 
# mkdir -pv /data/mysql/dblog/binlog 
# mkdir -pv /data/mysql/dblog/relaylog
# mkdir -pv /data/mysql/dblog/errlog
# mkdir -pv /data/mysql/dblog/slowlog
# mkdir -pv /data/mysql/run
# mkdir -pv /data/mysql/tmp
# mkdir -pv /data/mysql/lock/subsys
# chown -R mysql:mysql /data/mysql
# chmod -R 755 /data/mysql

4修改配置文件my.cnf参数
# 这一步不用再执行:cp /data/mysql/support-files/my-default.cnf  /etc/my.cnf (在5.7.18开始,二进制包不再包含示例文件my-default.cnf)
A、----------主数据库配置---------
# vim  /etc/my.cnf
配置文件以https://tools.percona.com/wizard 生成为基础,修改了相关路径,配置为:
物理服务器,cpu 8 core  8G ram
---------------------------------------------------------------------------------------------------------------------------------
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
# *** DO NOT EDIT THIS FILE. It's a template which will be copied to the
# *** default location during install, and will be replaced if you
# *** upgrade to a newer version of MySQL.

#[mysqld]

# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M

# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin

# These are commonly set, remove the # and set as required.
# basedir = .....
# datadir = .....
# port = .....
# server_id = .....
# socket = .....

# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M

[mysql]

# CLIENT #
port = 3306
socket = /data/mysql/run/mysql.sock
disable-auto-rehash
default-character-set=gbk
prompt=(\u@\h) [\d]>\_

[mysqld]

# GENERAL #
server_id = 128
port = 3306
user = mysql
explicit_defaults_for_timestamp=true

default-storage-engine = InnoDB
character_set_server = gbk
auto_increment_increment = 2
auto_increment_offset = 1
lower_case_table_names = 1
socket = /data/mysql/run/mysql.sock
pid_file = /data/mysql/run/mysqld.pid

# MyISAM #
key-buffer-size                = 32M
myisam-recover-options         = FORCE,BACKUP

# SAFETY #
max_allowed_packet = 134217728
max_connections = 2048
max_user_connections = 1024
open_files_limit = 65535
skip-name-resolve
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
sysdate-is-now                 = 1

# DATA STORAGE #
basedir = /data/mysql
datadir = /data/mysql/data/
tmpdir = /data/mysql/tmp

# BINARY LOGGING #
log-bin = /data/mysql/dblog/binlog/master-bin
log-bin-index = /data/mysql/dblog/binlog/master-bin.index
expire-logs-days = 15
sync-binlog = 1
binlog_format = ROW

#RELAY LOGGING
relay-log=/data/mysql/dblog/relaylog/master-relay-bin
relay-log-index=/data/mysql/dblog/relaylog/master-relay-bin.index
# sync_relay_log=1 最安全,崩溃后最多丢失一个事件,但是会引起同步延迟

# CACHES AND LIMITS #
tmp-table-size                 = 32M
max-heap-table-size            = 32M
query-cache-type               = 0
query-cache-size               = 0
thread-cache-size              = 50
open-files-limit               = 65535
table-definition-cache         = 1024
table-open-cache               = 2048

# INNODB #
innodb_log_group_home_dir = /data/mysql/dblog/iblog
innodb_data_home_dir = /data/mysql/dblog/iblog
innodb-flush-method = O_DIRECT
innodb-log-files-in-group      = 2
innodb-log-file-size           = 256M
innodb-flush-log-at-trx-commit = 1
innodb-file-per-table          = 1
innodb-buffer-pool-size        = 6G

# LOGGING #
log_timestamps=system
general_log = off
log-error                      = /data/mysql/dblog/errlog/mysql-error.log
log-queries-not-using-indexes  = 1
slow-query-log                 = 1
slow-query-log-file            = /data/mysql/dblog/slowlog/mysql-slow.log
log_slave_updates=ON

5执行MySQL安装脚本
# cd /data/mysql/bin
# ./mysqld  --defaults-extra-file=/etc/my.cnf --basedir=/data/mysql --datadir=/data/mysql/data --user=mysql --initialize-insecure
检测日志:
/data/mysql/dblog/errlog/mysql-error.log
若报错:
/bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory
解决:
# yum install libaio (这一步不用执行)

# ./mysql_ssl_rsa_setup --basedir=/data/mysql --datadir=/data/mysql/data
(MySQL 5.7.6 版本之后,MySQL SSL Certificate and RSA Key Generation Utility)

6修改系统环境变量
# vim /etc/profile.d/mysql.sh

#!/bin/bash

PATH=/data/mysql/bin:$PATH

# source /etc/profile.d/mysql.sh


7自启动脚本
# cp /data/mysql/support-files/mysql.server /etc/init.d/mysqld

# vim /etc/init.d/mysqld 
修改mysqld_pid_file_path=/data/mysql/run/mysqld.pid
修改 lockdir='/data/mysql/lock/subsys'

# chkconfig --add mysqld
# /etc/init.d/mysqld start 
# /etc/init.d/mysqld stop
# service mysqld start
# service mysqld restart

8 删除匿名账户,设置root密码

密码是password

# mysql

mysql> use mysql;
mysql > DELETE FROM mysql.user WHERE User='';
mysql> DELETE FROM mysql.user WHERE host='localhost';
mysql> SELECT host, user, authentication_string FROM user WHERE user = 'root';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' IDENTIFIED BY 'password' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;

设置主从架构

master数据库修改配置,在上一步的基础上进行修改

[client]
port = 3306
socket =/data/mysql/run/mysql.sock
default-character-set = utf8mb4

default-character-set=utf8mb4
character_set_server = utf8mb4

server_id = 100

#relay-log=/data/mysql/dblog/relaylog/master-relay-bin
#relay-log-index=/data/mysql/dblog/relaylog/master-relay-bin.index

slave数据库修改配置,在上一步的基础上进行修改

[client]
port = 3306
socket =/data/mysql/run/mysql.sock
default-character-set = utf8mb4

default-character-set=utf8mb4
character_set_server = utf8mb4

server_id = 200

relay-log=/data/mysql/dblog/relaylog/slave-relay-bin
relay-log-index=/data/mysql/dblog/relaylog/slave-relay-bin.index

log-bin = /data/mysql/dblog/binlog/slave-bin
log-bin-index = /data/mysql/dblog/binlog/slave-bin.index

重启数据库

完整的master配置

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
# *** DO NOT EDIT THIS FILE. It's a template which will be copied to the
# *** default location during install, and will be replaced if you
# *** upgrade to a newer version of MySQL.

#[mysqld]

# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M

# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin

# These are commonly set, remove the # and set as required.
# basedir = .....
# datadir = .....
# port = .....
# server_id = .....
# socket = .....

# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M


[client]
port = 3306
socket =/data/mysql/run/mysql.sock
default-character-set = utf8mb4

[mysql]

# CLIENT #
port = 3306
socket = /data/mysql/run/mysql.sock
disable-auto-rehash
default-character-set=utf8mb4
prompt=(\u@\h) [\d]>\_

[mysqld]

# GENERAL #
server_id = 100
port = 3306
user = mysql
explicit_defaults_for_timestamp=true

default-storage-engine = InnoDB
character_set_server = utf8mb4
auto_increment_increment = 2
auto_increment_offset = 1
lower_case_table_names = 1
socket = /data/mysql/run/mysql.sock
pid_file = /data/mysql/run/mysqld.pid

# MyISAM #
key-buffer-size                = 32M
myisam-recover-options         = FORCE,BACKUP

# SAFETY #
max_allowed_packet = 134217728
max_connections = 2048
max_user_connections = 1024
open_files_limit = 65535
skip-name-resolve
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
sysdate-is-now                 = 1

# DATA STORAGE #
basedir = /data/mysql
datadir = /data/mysql/data/
tmpdir = /data/mysql/tmp

# BINARY LOGGING #
log-bin = /data/mysql/dblog/binlog/master-bin
log-bin-index = /data/mysql/dblog/binlog/master-bin.index
expire-logs-days = 15
sync-binlog = 1
binlog_format = ROW

#RELAY LOGGING
#relay-log=/data/mysql/dblog/relaylog/master-relay-bin
#relay-log-index=/data/mysql/dblog/relaylog/master-relay-bin.index
# sync_relay_log=1 最安全,崩溃后最多丢失一个事件,但是会引起同步延迟

# CACHES AND LIMITS #
tmp-table-size                 = 32M
max-heap-table-size            = 32M
query-cache-type               = 0
query-cache-size               = 0
thread-cache-size              = 50
open-files-limit               = 65535
table-definition-cache         = 1024
table-open-cache               = 2048

# INNODB #
innodb_log_group_home_dir = /data/mysql/dblog/iblog
innodb_data_home_dir = /data/mysql/dblog/iblog
innodb-flush-method = O_DIRECT
innodb-log-files-in-group      = 2
innodb-log-file-size           = 256M
innodb-flush-log-at-trx-commit = 1
innodb-file-per-table          = 1
innodb-buffer-pool-size        = 6G

# LOGGING #
log_timestamps=system
general_log = off
log-error                      = /data/mysql/dblog/errlog/mysql-error.log
log-queries-not-using-indexes  = 1
slow-query-log                 = 1
slow-query-log-file            = /data/mysql/dblog/slowlog/mysql-slow.log
log_slave_updates=ON

完整的slave配置

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
# *** DO NOT EDIT THIS FILE. It's a template which will be copied to the
# *** default location during install, and will be replaced if you
# *** upgrade to a newer version of MySQL.

#[mysqld]

# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M

# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin

# These are commonly set, remove the # and set as required.
# basedir = .....
# datadir = .....
# port = .....
# server_id = .....
# socket = .....

# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M

[client]
port = 3306
socket =/data/mysql/run/mysql.sock
default-character-set = utf8mb4


[mysql]

# CLIENT #
port = 3306
socket = /data/mysql/run/mysql.sock
disable-auto-rehash
default-character-set=utf8mb4
prompt=(\u@\h) [\d]>\_

[mysqld]

# GENERAL #
server_id = 200
port = 3306
user = mysql
explicit_defaults_for_timestamp=true

default-storage-engine = InnoDB
character_set_server = utf8mb4
auto_increment_increment = 2
auto_increment_offset = 1
lower_case_table_names = 1
socket = /data/mysql/run/mysql.sock
pid_file = /data/mysql/run/mysqld.pid

# MyISAM #
key-buffer-size                = 32M
myisam-recover-options         = FORCE,BACKUP

# SAFETY #
max_allowed_packet = 134217728
max_connections = 2048
max_user_connections = 1024
open_files_limit = 65535
skip-name-resolve
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
sysdate-is-now                 = 1

# DATA STORAGE #
basedir = /data/mysql
datadir = /data/mysql/data/
tmpdir = /data/mysql/tmp

# BINARY LOGGING #
log-bin = /data/mysql/dblog/binlog/slave-bin
log-bin-index = /data/mysql/dblog/binlog/slave-bin.index
expire-logs-days = 15
sync-binlog = 1
binlog_format = ROW

#RELAY LOGGING
relay-log=/data/mysql/dblog/relaylog/slave-relay-bin
relay-log-index=/data/mysql/dblog/relaylog/slave-relay-bin.index
# sync_relay_log=1 最安全,崩溃后最多丢失一个事件,但是会引起同步延迟

# CACHES AND LIMITS #
tmp-table-size                 = 32M
max-heap-table-size            = 32M
query-cache-type               = 0
query-cache-size               = 0
thread-cache-size              = 50
open-files-limit               = 65535
table-definition-cache         = 1024
table-open-cache               = 2048

# INNODB #
innodb_log_group_home_dir = /data/mysql/dblog/iblog
innodb_data_home_dir = /data/mysql/dblog/iblog
innodb-flush-method = O_DIRECT
innodb-log-files-in-group      = 2
innodb-log-file-size           = 256M
innodb-flush-log-at-trx-commit = 1
innodb-file-per-table          = 1
innodb-buffer-pool-size        = 6G

# LOGGING #
log_timestamps=system
general_log = off
log-error                      = /data/mysql/dblog/errlog/mysql-error.log
log-queries-not-using-indexes  = 1
slow-query-log                 = 1
slow-query-log-file            = /data/mysql/dblog/slowlog/mysql-slow.log
log_slave_updates=ON
登录master数据库创建同步数据库使用的用户
mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'Gp.031!Jdd';
Query OK, 0 rows affected (0.01 sec)

mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;

# 查看是否开启binlog
mysql> show variables like 'log_bin';

mysql> show master status;
记录如下这俩值
master-bin.000005 |      625

登录【从数据库】,进入mysql命令行。

mysql> stop slave;

# 命令说明
mysql> CHANGE MASTER TO MASTER_HOST='192.168.2.164', # 主库ip
MASTER_PORT=3306, # 主库端口
MASTER_USER='repl', # 主库同步用的账号
MASTER_PASSWORD='Gp.031!Jdd', # 主库同步用的密码
MASTER_LOG_FILE='master-bin.000005', # 主库信息,上一步中记录的
MASTER_LOG_POS=625;   # 主库信息,上一步中记录的

mysql> CHANGE MASTER TO MASTER_HOST='192.168.2.164',
MASTER_PORT=3306,
MASTER_USER='repl',
MASTER_PASSWORD='Gp.031!Jdd',
MASTER_LOG_FILE='master-bin.000005',
MASTER_LOG_POS=625;

mysql> start slave;
Query OK, 0 rows affected
stop slave; //停止同步
start slave; //开始同步
//必须和【主数据库】的信息匹配。
//【关键处】从主库的该log_bin文件开始读取同步信息,主库show master status返回结果
MASTER_LOG_FILE='mysql-bin.000005',
//【关键处】从文件中指定位置开始读取,主库show master status返回结果
MASTER_LOG_POS=625;
mysql> show slave status G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.2.164
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000005
          Read_Master_Log_Pos: 625
               Relay_Log_File: slave-relay-bin.000002
                Relay_Log_Pos: 321
        Relay_Master_Log_File: master-bin.000005
             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: 625
              Relay_Log_Space: 528
              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: 100
                  Master_UUID: aff8daef-9767-11eb-a072-00505623c794
             Master_Info_File: /data/mysql/data/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave 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: 
1 row in set (0.00 sec)

只有【Slave_IO_Running】和【Slave_SQL_Running】都是Yes,则同步是正常的。
如果是No或者Connecting都不行,可查看mysql-error.log,以排查问题。

然后是测试,在主数据库上创建库,创建表,新增数据,修改数据,删除数据
每一步都查看从数据库上的显示

补充:
如果【主服务器】重启mysql服务,【从服务器】会等待与【主服务器】重连。当主服务器恢复正常后,从服务器会自动重新连接上主服务器,并正常同步数据。
如果某段时间内,【从数据库】服务器异常导致同步中断(可能是同步点位置不匹配),可以尝试以下恢复方法:进入【主数据库】服务器(正常),在bin-log中找到【从数据库】出错前的position,然后在【从数据库】上执行change master,将master_log_file和master_log_pos重新指定后,开始同步。

原文地址:https://www.cnblogs.com/sanduzxcvbnm/p/14631747.html