Linux下配置MySQL主从复制

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL的主从复制是自己一直想学习的一个实战经历,因为Oracle中的主从复制也是需要不少的配置选项,相比来说感觉重量级一些(数据量也重量级). 今天试了一下,在本地的一台Linux虚拟机上简单模拟了一把,发现还是蛮有趣的。
MySQL的主从复制是自己一直想学习的一个实战经历,因为Oracle中的主从复制也是需要不少的配置选项,相比来说感觉重量级一些(数据量也重量级).
今天试了一下,在本地的一台Linux虚拟机上简单模拟了一把,发现还是蛮有趣的。因为也是外行,所以为了快速达到效果,自己看了一个很早的视频,结果实际操作的时候,有好几个配置参数都已经没有了。看来还是需要静下心来慢慢做,在Windows上配置了一下,因为各种各样的原因,就是没有配置出来,个人还是喜欢Linux环境下弄,今天加了把劲总算有点苗头了。
大体的步骤有几个,
创建两个操作系统用户,加入dba组。
在master库所在用户上安装MySQL
在slave库所在的用户上安装MySQL
配置主从复制关系
启动slave检查

首先来看看原理图,估计这个图都被共享得无处不在了。可以从图中看到主从复制的基本原理就是使用binlog来完成的。这个binlog(二进制日志)可以很灵活地解析出对应的sql语句来,基本上就是在slave端做一个类似回放的工作了。不过这个过程相对持续时间很短,数据量小,事务小的情况下,完全感觉不到延时。

我们来看看怎么做吧。因为使用MySQL自己想尽量不取默认值,就没有选择rpm包安装和yum安装等方式,直接从网站上得到了Lib包。直接解压就能运行的。
对于默认的端口3306自己就指定为1550,日志路径等配置都是通过手动完成,也算能够感受到MySQL在后台处理的时候那些是必要的。
安装的过程很容易。
在glibc多的解压文件的路径, 我配置了一个MYSQL_BASE的变量,通过手工命令来安装。
[mysql@oel1 mysql-advanced-5.6.23-linux-glibc2.5-i686]$ ll
total 288
-rw-r--r--  1 mysql dba 120908 Apr  7 16:11 a.log
drwxr-xr-x  2 mysql dba   4096 Apr  5 15:41 bin
drwxr-xr-x  2 mysql dba   4096 Apr  5 15:41 docs
drwxr-xr-x  3 mysql dba   4096 Apr  5 15:41 include
-rw-r--r--  1 mysql dba 102509 Jan 29 21:11 INSTALL-BINARY
drwxr-xr-x  3 mysql dba   4096 Apr  5 15:42 lib
-rw-r--r--  1 mysql dba   2729 Jan 29 21:11 LICENSE.mysql
drwxr-xr-x  4 mysql dba   4096 Apr  5 15:41 man
-rw-r--r--  1 mysql dba   1029 Apr  5 15:49 my.cnf
-rw-r--r--  1 mysql dba   1029 Apr 14 18:56 my-new.cnf
drwxr-xr-x 10 mysql dba   4096 Apr  5 15:41 mysql-test
-rw-r--r--  1 mysql dba   1449 Jan 29 21:11 README
drwxr-xr-x  2 mysql dba   4096 Apr  5 15:41 scripts
drwxr-xr-x 28 mysql dba   4096 Apr  5 15:42 share
drwxr-xr-x  4 mysql dba   4096 Apr  5 15:41 sql-bench
drwxr-xr-x  2 mysql dba   4096 Apr  5 15:45 support-files
配置的profile变量如下:
PATH=$PATH:$HOME/bin
export MYSQL_BASE=/u02/mysql/mysql-advanced-5.6.23-linux-glibc2.5-i686
export MYSQL_DATA=/u02/mysql/data
export PATH=$PATH:$MYSQL_BASE/bin:$MYSQL_DATA

然后运行命令安装,其实也就是初始化工作了,指定的端口是1550
$MYSQL_BASE/scripts/mysql_install_db --user=mysql --basedir=$MYSQL_BASE --datadir=$MYSQL_DATA  --port=1550

然后我们启动mysql就可以了。启动的命令相对选项要多一些,我们不适用.cnf文件来配置了,纯手工方式来看看。
$MYSQL_BASE/bin/mysqld_safe --user=mysql --basedir=$MYSQL_BASE --datadir=$MYSQL_DATA --port=1550 --log-bin=mysql_oel1_bin  --log-error=/u02/mysql/log/log_error.log   --long_query_time=5 --slow-query-log=true --slow-query-log-file=/u02/mysql/log/slow_qeury.log  --socket=/u02/mysql/mysqld_mst.sock  --server-id=1 &

这样在master端就搞定了。
slave端的工作也是类似,或者如果偷懒自己也可以直接把解压包拷贝过去。如果安装初始化的时候就需要重新制定端口了,我们定位1551吧。
先不配置slave,看能不能启动。
$MYSQL_BASE/bin/mysqld_safe --user=mysql --basedir=$MYSQL_BASE --datadir=$MYSQL_DATA --port=1551 --log-bin=mysql_oel1_slv1_bin  --log-error=/u02/mysqlslv1/log/log_error.log   --long_query_time=5 --slow-query-log=true --slow-query-log-file=/u02/mysqlslv1/log/slow_qeury.log --socket=/u02/mysqlslv1/mysql_slv1.sock 

启动之后,验证无误,我们就可以开始配置了。
主从配置相对来说还是很简单的,如果过多的规则要求,还是很容易的。
在主库我们需要配置一个用户作为复制所用。
mysql> grant replication slave on *.* to 'slaveuser'@'192.168.27.130' identified by 'slaveuser';
Query OK, 0 rows affected (0.00 sec)
这个新建用户在user中就有所体现了。
mysql> select host,user,password from user;
+----------------+-----------+-------------------------------------------+
| host           | user      | password                                  |
+----------------+-----------+-------------------------------------------+
| localhost      | root      | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
| oel1           | root      | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
| 127.0.0.1      | root      |                                           |
| ::1            | root      |                                           |
| %              | test      |                                           |
| 192.168.27.130 | slaveuser | *7890E850D4C4DF85267DEC80307D6CCAEC115B2F |
+----------------+-----------+-------------------------------------------+
6 rows in set (0.00 sec)

查看master的情况
mysql> show master status;
+-----------------------+----------+--------------+------------------+-------------------+
| File                  | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------------+----------+--------------+------------------+-------------------+
| mysql_oel1_bin.000004 |      520 |              |                  |                   |
+-----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

然后到slave端,重新启动一下,配置一下server-id我们设置为2,指定端口为1551
$MYSQL_BASE/bin/mysqld_safe --user=mysql --basedir=$MYSQL_BASE --datadir=$MYSQL_DATA --port=1551 --log-bin=mysql_oel1_slv1_bin  --log-error=/u02/mysqlslv1/log/log_error.log   --long_query_time=5 --slow-query-log=true --slow-query-log-file=/u02/mysqlslv1/log/slow_qeury.log --socket=/u02/mysqlslv1/mysql_slv1.sock   --server-id=2   &

启动完成之后,运行下面的语句来在slave端配置就可以了,这个过程就如同一个db link的感觉。
mysql> change master to master_host='192.168.27.130', master_user='slaveuser', master_password='slaveuser',master_port=1550;
Query OK, 0 rows affected, 2 warnings (0.04 sec)

mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
启动之后。直接查看show slave status \G就能看到slave端的一个基本情况了。很可能由于操作原因,出现一些复制的问题,我们可以指定skip的范围,下面这样操作。

mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)

mysql> SET GLOBAL sql_slave_skip_counter =100;
Query OK, 0 rows affected (0.02 sec)


mysql> start slave;
Query OK, 0 rows affected (0.01 sec)


mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.27.130
                  Master_User: slaveuser
                  Master_Port: 1550
                Connect_Retry: 60
              Master_Log_File: mysql_oel1_bin.000005
          Read_Master_Log_Pos: 436
               Relay_Log_File: oel1-relay-bin.000010
                Relay_Log_Pos: 288
        Relay_Master_Log_File: mysql_oel1_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: 98
          Exec_Master_Log_Pos: 436
              Relay_Log_Space: 628
              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: 02c8b5e4-e295-11e4-8db2-000c296415de
             Master_Info_File: /u02/mysqlslv1/data/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
           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
1 row in set (0.00 sec)

然后我们在master端删除一个表new,可以从slave端看不到这个表了。
创建之前,slave中的表
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| innodb_test    |
| myisam_test    |
| new            |
| new_test       |
| test3          |
| test4          |
+----------------+
6 rows in set (0.00 sec)

创建之后,马上查看,很快就同步了。
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| innodb_test    |
| myisam_test    |
| new_test       |
| test3          |
| test4          |
+----------------+
5 rows in set (0.00 sec)

然后依次类推,很轻松就在十多分钟内又弄了一套slave环境。总体感觉就是轻巧和简便。
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4天前
|
消息中间件 安全 Linux
服务器(Linux)在线下载activeMQ以及配置打开
服务器(Linux)在线下载activeMQ以及配置打开
14 3
|
4天前
|
Ubuntu Linux 编译器
【Linux】详解动静态库的制作和使用&&动静态库在系统中的配置步骤
【Linux】详解动静态库的制作和使用&&动静态库在系统中的配置步骤
|
4天前
|
缓存 监控 关系型数据库
2核4G 配置的MySQL 5.6如何调优为最佳qps,tps
要提高具有2核4G配置的MySQL 5.6的QPS(每秒查询率)和TPS(每秒事务数),可以通过以下方法进行调优: 1. 优化配置文件(my.cnf): 在MySQL的配置文件中,可以调整以下参数以提高性能: ``` [mysqld] innodb_buffer_pool_size = 1.5G # 设置InnoDB缓冲池大小,推荐值为服务器总内存的50%-80% max_connections = 500 # 设置最大连接数,根据实际需求进行调整 query_cache_size = 128M # 设置查询缓存大小,推荐值
|
4天前
|
关系型数据库 MySQL Linux
Linux下安装MySQL
Linux下安装MySQL
18 0
|
4天前
|
SQL 关系型数据库 MySQL
Linux对MySQL语法校验
【5月更文挑战第4天】
|
4天前
|
关系型数据库 MySQL Linux
服务器Linux系统配置mysql数据库主从自动备份
这是一个基本的配置主从复制和设置自动备份的指南。具体的配置细节和命令可能因您的环境和需求而有所不同,因此建议在操作前详细阅读MySQL文档和相关资源,并谨慎操作以避免数据丢失或不一致。
15 3
|
4天前
|
SQL canal 运维
MySQL高可用架构探秘:主从复制剖析、切换策略、延迟优化与架构选型
MySQL高可用架构探秘:主从复制剖析、切换策略、延迟优化与架构选型
|
4天前
|
Unix Shell Linux
在 Linux 上把 Vim 配置为默认编辑器
在 Linux 上把 Vim 配置为默认编辑器
|
4天前
|
运维 负载均衡 关系型数据库
MySQL高可用解决方案演进:从主从复制到InnoDB Cluster架构
MySQL高可用解决方案演进:从主从复制到InnoDB Cluster架构
|
4天前
|
存储 Web App开发 Ubuntu
整理16款适用于较旧低配置电脑的最佳Linux发行版
在本指南中,趣云笔记(https://www.ecscoupon.com/)介绍了一些最好的Linux发行版,你可以将它们安装在旧PC上并为其注入新的活力。
44 0