theboyaply
theboyaply
发布于 2023-06-16 / 280 阅读
0
1

mysql8主从配置

参考:

https://www.cnblogs.com/cao-lei/p/13603043.html

https://www.jianshu.com/p/e33c861c2141

服务器配置

两台服务器:

  • 192.168.19.112(主)
  • 192.168.19.113(从)

测试的话,1G内存即可。

安装MYSQL8数据库

  1. 主、从数据库的my.cnf文件内容需要加上bin-log相关配置,可参考下面提供的示例。
  2. 分别安装好主从数据库,记得修改my.cnf内容。参考:https://www.theboyaply.cn/archives/linux-install-mysql8
  3. 分别给主从数据库创建一个能远程连接的账号(主要是为了方便用客户端工具进行验证,如果实际业务不需要,可以不用创建。这里默认创建了两个usernametom的账户)。
  4. 关闭服务器防火墙或开通3306端口。

主数据库my.cnf内容

[mysqld]
basedir=/home/mysql8.0.27
datadir=/home/mysql8.0.27/data
port=3306
user=mysql

# 允许最大连接数
max_connections=400

# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8mb4

# 排序规则
collation_server=utf8mb4_general_ci

# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB

# 允许传输数据最大值
max_allowed_packet=16M

#linux不区分表大小写0区分1不区分
lower_case_table_names=1

# 设置账号默认登录方式
default_authentication_plugin=mysql_native_password

#log-error=/var/log/mariadb/mariadb.log
log-error=/home/mysql8.0.27/log/mysql.err
# pid文件位置
pid-file=/home/mysql8.0.27/mysql.pid

# 开启binlog需要指定server-id,正整数,不能与其它数据库重复
server-id=1

# binlog文件的前缀
log-bin=mysql-bin

# binlog文件保存的天数,默认0表示永久保存
#expire_logs_days=15
# mysql8+版本新增了这个参数,精确到秒,优先级高于expire_logs_days
binlog_expire_logs_seconds=2592000

# binlog记录的模式
# statement模式不会记录每一条更改语句,节约资源但主从数据可能不一致
# row模式记录每一条更改的语句,日志量非常大(默认)
# mixed模式是前两者优点的综合,但日志结构较为复杂
binlog_format=mixed

# 设置需要复制的数据库(可设置多个),不设置默认为全部
#binlog-do-db=test1
#binlog-do-db=test2
# 设置不要复制的数据库,不设置默认为空
#binlog-ignore-db=sys
#binlog-ignore-db=mysql
#binlog-ignore-db=information_schema
#binlog-ignore-db=performance_schema

# 缓存大小,一般生产服务器需要配置,建议为服务器总内存50%,默认128M
innodb_buffer_pool_size=4G
innodb_flush_log_at_trx_commit=1
innodb_data_file_path = ibdata1:1G;ibdata2:12M:autoextend:max:5G

# socket=/var/lib/mysql/mysql.sock
# 建议就放在这个位置,登录mysql时会从这里找mysql.sock
socket=/tmp/mysql.sock

#sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
#default_authentication_plugin=mysql_native_password

从数据库my.cnf内容

大部分内容与主数据库一致,下面参数要修改:

[mysqld]
# 开启binlog需要指定server-id,不能与主库一样
server-id=2

# 启用中继日志。从数据库的bin-log相关配置,就只要这一个参数即可
relay-log=mysql-relay

测试数据库互通性

使用创建的两个tom账号,分别进行远程连接,看两个数据库是否互通。

# 在主数据库服务器运行以下命令,测试从数据库
mysql -utom -p -h192.168.19.113 -P3306

# 在从数据库服务器运行以下命令,主数据库
mysql -utom -p -h192.168.19.112 -P3306

主服务器创建同步账号

需要给主数据库创建一个专门用来同步数据的mysql账号(PS:如果已经有一个足够权限的账号,可以直接用)。

# 这里的%可以改为从数据库的IP
mysql> create user 'slaveAccount'@'%' identified by '123456';

# 这里的%可以改为从数据库的IP(要与创建用户时指定的一致)
# 可以把‘all privileges’替换为‘replication slave’,即只授予主从同步权限
mysql> grant all privileges on *.* to 'slaveAccount'@'%';
mysql> flush privileges;

创建完后去从数据库进行远程连接,看是否成功。

检查主数据库

# 登录
mysql -uroot -p

# 查询server_id是否可配置文件中一致
mysql> show variables like 'server_id';

# 若不一致,可设置临时ID(重启失效)
mysql> set global server_id = 1;

# 查询Master状态,并记录 File 和 Position 的值
mysql> show master status;

# 注意:执行完此步骤后退出主数据库,防止再次操作导致 File 和 Position 的值发生变化

检查/设置从数据库

# 登录
mysql -uroot -p

# 查询server_id是否可配置文件中一致
mysql> show variables like 'server_id';

# 若不一致,可设置临时ID(重启失效)
mysql> set global server_id = 2;

# 设置主数据库参数
mysql> change master to master_host='192.168.19.112',
master_port=3306,
master_user='slaveAccount',
master_password='123456',
master_log_file='mysql-bin.000002',
master_log_pos=2290;

# 如果之前配置过master信息,比如配置过主从同步用的用户和密码,则现在只需要重置其余部分,可以不重置master_user与master_password,只填写master_log_file和master_log_pos即可。

# 开始同步
mysql> start slave;

# 若出现错误,则停止同步,重置后再次启动
mysql> stop slave;
mysql> reset slave;
mysql> start slave;

# 查询Slave状态
mysql> show slave status\G

# 查看是否配置成功
# 查看参数 Slave_IO_Running 和 Slave_SQL_Running 是否都为yes,则证明配置成功。若为no,则需要查看对应的 Last_IO_Error 或 Last_SQL_Error 的异常值。

show slave status\G运行结果:

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 192.168.19.112
                  Master_User: slave_1
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 3129
               Relay_Log_File: mysql-relay.000002
                Relay_Log_Pos: 1163
        Relay_Master_Log_File: mysql-bin.000002
             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: 3129
              Relay_Log_Space: 1368
              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: 67e396f3-0c15-11ee-bbd5-000c299db5a3
             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.00 sec)

测试

进入主数据库,创建一个数据库,一张表,一条数据。然后进入从数据库,看是否已经同步过来。

注意,使用主从同步的数据库,不要去修改从数据库的数据,不然会导致两个数据库信息不一致。

– end –


评论