mysql 的master-slave的搭建
发布日期:2021-09-16 04:38:53 浏览次数:69 分类:技术文章

本文共 11383 字,大约阅读时间需要 37 分钟。

为了测试半同步复制,首先搭建一套mysql 主从复制,目前我有两台机器安装的mysql版本一致5.6版本
一、设置参数文件
参数修改 :
[mysqld]
log_bin = mysql-bin
port = 3306
character-set-server = utf8
lower_case_table_names = 1
log_error = /var/lib/mysql/mysql-error.log
datadir=/var/lib/mysql  
socket=/var/lib/mysql/mysql.sock  
key_buffer_size = 100M
join_buffer_size = 128M
sort_buffer_size = 24M
read_rnd_buffer_size = 24M
#innodb相关参数
default_storage_engine = INNODB
innodb_buffer_pool_size = 48M
innodb_log_file_size = 24M
innodb_log_files_in_group = 4
innodb_log_buffer_size = 8M
innodb_file_per_table = 1
innodb_additional_mem_pool_size = 32M
innodb_thread_concurrency = 32
innodb_flush_method = O_DIRECT
innodb_file_format=Barracuda
log-bin-trust-function-creators = 1
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
binlog-ignore-db = mysql,information_schema
sync_binlog = 1
skip-external-locking
skip-host-cache
skip-name-resolve
collation-server = utf8_general_ci
long_query_time = 1
slow_query_log_file = /var/lib/mysql/mysql-slow.log

max_connections = 500

#主库添加一些mysql主从复制的参数  

replicate-ignore-db = mysql     # ignore 不复制 忽视
binlog-ignore-db  = mysql   # ignore 不更改日志二进制模式
 
server-id           = 1  
log_bin             = /var/lib/mysql/mysql-bin.log             #开启二进制日志复制
log_bin_index       = /var/lib/mysql/mysql-bin.log.index
expire_logs_days    = 10
max_binlog_size     = 100M

从库添加的参数

#添加一些mysql主从复制的参数  

replicate-ignore-db = mysql     # ignore 不复制 忽视
binlog-ignore-db  = mysql   # ignore 不更改日志二进制模式
  
server-id           = 2 
log_bin             = /var/lib/mysql/mysql-bin.log             #开启二进制日志复制
log_bin_index       = /var/lib/mysql/mysql-bin.log.index
relay_log           = /var/lib/mysql/mysql-bin.relay     #从库参数
relay_log_index     = /var/lib/mysql/mysql-bin.relay.index     #从库参数
expire_logs_days    = 10
max_binlog_size     = 100M
MySQL主从复制几个重要的启动选项,当然这里有些选项不是必须的,所以参数文件中没有用
  (1)  log-slave-updates
  log-slave-updates这个参数用来配置从服务器的更新是否写入二进制日志,这个选项默认是不打开的,但是,如果这个从服务器B是服务器A的从服务器,同时还作为服务器C的主服务器,那么就需要开发这个选项,这样它的从服务器C才能获得它的二进制日志进行同步操作
  (2)  master-connect-retry
  master-connect-retry这个参数是用来设置在和主服务器连接丢失的时候,重试的时间间隔,默认是60秒
  (3)  read-only
  read-only是用来限制普通用户对从数据库的更新操作,以确保从数据库的安全性,不过如果是超级用户依然可以对从数据库进行更新操作
  (4)  slave-skip-errors
  在复制过程中,由于各种的原因,从服务器可能会遇到执行BINLOG中的SQL出错的情况,在默认情况下,服务器会停止复制进程,不再进行同步,等到用户自行来处理。
  Slave-skip-errors的作用就是用来定义复制过程中从服务器可以自动跳过的错误号,当复制过程中遇到定义的错误号,就可以自动跳过,直接执行后面的SQL语句。
  --slave-skip-errors=[err1,err2,…….|ALL]
  但必须注意的是,启动这个参数,如果处理不当,很可能造成主从数据库的数据不同步,在应用中需要根据实际情况,如果对数据完整性要求不是很严格,那么这个选项确实可以减轻维护的成本
   (5)server_id
  主从配置中是必须的,而且唯一。slave没有必要开启二进制日志,但是在一些情况下,必须设置,例如,如果slave为其它slave的master,必须设置bin_log。在这里,
  我们开启了二进制日志,而且显示的命名(默认名称为hostname,但是,如果hostname改变则会出现问题)。
relay log:relay log很多方面都跟binary log差不多,区别是:从服务器I/O线程将主服务器的二进制日志读取过来记录到从服务器本地文件,然后SQL线程会读取relay-log日志的内容并应用到从服务器。
 
 max_relay_log_size:
标记relay log 允许的最大值,如果该值为0,则默认值为max_binlog_size(1G);如果不为0,则max_relay_log_size则为最大的relay_log文件大小;
relay_log:
定义relay_log的位置和名称,如果值为空,则默认位置在数据文件的目录,文件名为host_name-relay-bin.nnnnnn  (By default, relay log file names have the form host_name-relay-bin.nnnnnn in the data directory)
 relay_log_index:同relay_log,定义relay_log的位置和名称;
 relay_log_info_file:设置relay-log.info的位置和名称(relay-log.info记录MASTER的binary_log的恢复位置和relay_log的位置)
relay_log_purge:是否自动清空不再需要中继日志时。默认值为1(启用)。
参数设置完后,重启mysql 数据库
[root@dg mysql]# service mysql restart
Shutting down MySQL..                                      [确定]
Starting MySQL..                                           [确定]
mysql> show master status\G;
*************************** 1. row ***************************
             File: mysql-bin.000028
         Position: 120
     Binlog_Do_DB: 
 Binlog_Ignore_DB: mysql,information_schema,mysql
Executed_Gtid_Set: 
1 row in set (0.00 sec)
这里我想让mysql 的日志文件从头开始,所以要重新设置 日志,reset master
RESET MASTER 
删除所有index file 中记录的所有binlog 文件,将日志索引文件清空,创建一个新的日志文件,这个命令通常仅仅用于第一次用于搭建主从关系的时的主库。
注意reset master 不同于purge binary log的两处地方 
1. reset master 将删除日志索引文件中记录的所有binlog文件,创建一个新的日志文件 起始值从000001 开始,然而purge binary log 命令并不会修改记录binlog的顺序的数值 
2. reset master 不能用于有任何slave 正在运行的主从关系的主库。因为在slave 运行时刻 reset master 命令不被支持,reset master 将master 的binlog从000001 开始记录,
   slave 记录的master log 则是reset master 时主库的最新的binlog,从库会报错无法找的指定的binlog文件。
RESET SLAVE 
reset slave 将使slave 忘记主从复制关系的位置信息。该语句将被用于干净的启动, 它删除master.info文件和relay-log.info 文件以及所有的relay log 文件并重新启用一个新的relaylog文件。
使用reset slave之前必须使用stop slave 命令将复制进程停止。
注意:所有的relay log将被删除不管他们是否被SQL thread进程完全应用(这种情况发生于备库延迟以及在备库执行了stop slave 命令),存储复制链接信息的master.info文件将被立即清除,
  如果SQL thread 正在复制临时表的过程中,执行了stop slave ,并且执行了reset slave,这些被复制的临时表将被删除。
RESET SLAVE有个问题,它虽然删除了上述文件,但内存中的change master信息并没有删除,此时,可直接执行start slave,但因为删除了master.info和relay-log.info,它会从头开始接受主的binlog并应用。
RESET SLAVE ALL 
在 5.6 版本中 reset slave 并不会清理存储于内存中的复制信息比如 master host, master port, master user, or master password,也就是说如果没有使用change master 命令做重新定向,
执行start slave 还是会指向旧的master 上面。
当从库执行reset slave之后,将mysqld shutdown 复制参数将被重置。
mysql> reset master;
Query OK, 0 rows affected, 2 warnings (0.13 sec)
mysql> show master status\G;
*************************** 1. row ***************************
             File: mysql-bin.000001
         Position: 120
     Binlog_Do_DB: 
 Binlog_Ignore_DB: mysql,information_schema,mysql
Executed_Gtid_Set: 
1 row in set (0.00 sec)
主库新建同步数据库需要的用户:
GRANT REPLICATION SLAVE ON *.* TO 'rep'@'10.10.6.%' IDENTIFIED BY 'mysql'; 
同步主从数据库:
mysql> FLUSH TABLES WITH READ LOCK;  
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW MASTER STATUS; 
+------------------+----------+--------------+--------------------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB               | Executed_Gtid_Set |
+------------------+----------+--------------+--------------------------------+-------------------+
| mysql-bin.000001 |      325 |              | mysql,information_schema,mysql |                   |
+------------------+----------+--------------+--------------------------------+-------------------+
1 row in set (0.00 sec)
注意保留上述信息,后面还会用到。另外,不要结束当前mysql控制台,重新打开一个窗口,导出数据库。
     
[root@dg ~]# mysqldump -uroot -p --all-databases > db_all.sql
mysql>  UNLOCK TABLES; 
Query OK, 0 rows affected (0.00 sec)
将导出的sql文件导入到从数据库服务器上。首先通过scp复制过去:
[root@dg ~]# scp db_all.sql  10.10.6.84:/root
db_all.sql                                                                                                                                                                                     100%   13MB  13.2MB/s   00:01    
从服务器的操作:
mysql -uroot -p < db_all.sql 
mysql> flush privileges; 

Query OK, 0 rows affected (0.03 sec)

mysql> reset slave;
Query OK, 0 rows affected (0.00 sec)
mysql> CHANGE MASTER TO master_host='10.10.6.86', master_port=3306, master_user='rep',master_password='mysql', master_log_file='mysql-bin.000001', master_log_pos=325; 
Query OK, 0 rows affected, 2 warnings (0.35 sec)
mysql> show warnings
    -> ;
+-------+------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Level | Code | Message                                                                                                                                                                                                                                                                              |
+-------+------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Note  | 1759 | Sending passwords in plain text without SSL/TLS is extremely insecure.                                                                                                                                                                                                               |
| Note  | 1760 | Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. |
+-------+------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: 10.10.6.86
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 325
               Relay_Log_File: mysql-bin.000008
                Relay_Log_Pos: 4
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: No
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: mysql
           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: 325
              Relay_Log_Space: 120
              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: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 1593
                Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it).
               Last_SQL_Errno: 0
此处错误是因为 主从的id设置的一样了,从库的id忘记修改参数文件的server-id = 1  ,导致主从id一样

修改参数文件,并且重启数据库查看

mysql> show variables like 'serv%';
+----------------+--------------------------------------+
| Variable_name  | Value                                |
+----------------+--------------------------------------+
| server_id      | 2                                    |
| server_id_bits | 32                                   |
| server_uuid    | 2d544f28-bbae-11e6-9ab0-005056917e27 |
+----------------+--------------------------------------+
3 rows in set (0.00 sec)
mysql> reset slave;
ERROR 1198 (HY000): This operation cannot be performed with a running slave; run STOP SLAVE first
mysql> 
mysql> 
mysql> stop slave;
Query OK, 0 rows affected (0.05 sec)
mysql> reset slave;
Query OK, 0 rows affected (0.11 sec)
mysql>  CHANGE MASTER TO master_host='10.10.6.86', master_port=3306, master_user='rep',master_password='mysql', master_log_file='mysql-bin.000001', master_log_pos=325; 
Query OK, 0 rows affected, 2 warnings (0.24 sec)
mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: 10.10.6.86
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 325
               Relay_Log_File: mysql-bin.000012
                Relay_Log_Pos: 4
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: No
            Slave_SQL_Running: No
mysql> start slave;
Query OK, 0 rows affected (0.02 sec)
mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.10.6.86
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 325
               Relay_Log_File: mysql-bin.000013
                Relay_Log_Pos: 283
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: mysql
验证:
主库:
mysql> create database t;
Query OK, 1 row affected (0.03 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| t                  |
| test               |
+--------------------+
5 rows in set (0.00 sec)
mysql> use t;
Database changed
mysql> create table t(id int,a varchar(10)) ENGINE=InnoDB ROW_FORMAT=COMPRESSED 
    -> ;
Query OK, 0 rows affected (0.24 sec)
mysql> insert into t values(1,'a');
Query OK, 1 row affected (0.05 sec)
mysql> insert into t values(2,'a');
Query OK, 1 row affected (0.07 sec)
mysql> insert into t values(3,'a');
Query OK, 1 row affected (0.05 sec)
从库 查看:
mysql> select * From t;
+------+------+
| id   | a    |
+------+------+
|    1 | a    |
|    2 | a    |
|    3 | a    |
+------+------+
3 rows in set (0.00 sec)
至此主从master-slave已经建立起来了

转载地址:https://blog.csdn.net/wll_1017/article/details/54890167 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:tx_isolation=READ-COMMITTED +binlog_format=STATEMENT产生的问题
下一篇:如何设置mysql innodb 表的压缩

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年03月31日 09时11分15秒