mysql主从复制(master-slave)_Mysql主从复制(master-slave)实际操作案例

本文详细介绍MySQL用户授权、主从复制设置步骤,并演示了如何实现数据同步,包括配置过程、常见错误处理及解决方法。

在这一章节里, 我们来了解下如何在 Mysql 中进行用户授权及主从复制

这里先来了解下 Mysql 主从复制的优点:

1、 如果主服务器出现问题, 可以快速切换到从服务器提供的服务

2、 可以在从服务器上执行查询操作, 降低主服务器的访问压力

3、 可以在从服务器上执行备份, 以避免备份期间影响主服务器的服务

注意一般只有更新不频繁的数据或者对实时性要求不高的数据可以通过从服务器查询, 实时性要求高的数据仍然需要从主数据库获得

在这里我们首先得完成用户授权, 目的是为了给从服务器有足够的权限来远程登入到主服务器的 Mysql

在这里我假设

主服务器的 IP 为: 192.168.10.1

从服务器的 IP 为: 192.168.10.2

Mysql grant 用户授权

查看 Mysql 的用户表

msyql> mysql -uroot -p123123;

msyql> select user, host, password from mysql.user;

结果如下:

+------------------+-----------+-------------------------------------------+

| user             | host      | password                                  |

+------------------+-----------+-------------------------------------------+

| root             | localhost | *E56A114692FE0DE073F9A1DD68A00EEB9703F3F1 |

| root             | 127.0.0.1 | *E56A114692FE0DE073F9A1DD68A00EEB9703F3F1 |

+------------------+-----------+-------------------------------------------+

从如上表中看以看出 root 用户只能从本机登入 Mysql, 也就是来自 localhost 或者 127.0.0.1

现在来通过 grant 命令来添加授权用户

msyql> ? grant   //查看 grant 的详细用法

msyql> grant all on *.* to user1@192.168.10.2 identified by "123456"; // *.* = 所有的数据库.所有的表

//或者

msyql> grant replication slave on *.* to 'user2'@'192.168.10.%' identified by "123456"; // %代表通配符

通过了 grant 命令给予了来自 192.168.10.2 的用户 user1 权限, 允许其远程登录, 如下:

+------------------+--------------+-------------------------------------------+

| user             | host         | password                                  |

+------------------+--------------+-------------------------------------------+

| root             | localhost    | *E56A114692FE0DE073F9A1DD68A00EEB9703F3F1 |

| root             | 127.0.0.1    | *E56A114692FE0DE073F9A1DD68A00EEB9703F3F1 |

| user1            | 192.168.10.2 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |

| user2            | 192.168.10.% | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |

+------------------+--------------+-------------------------------------------+

此时就可以在 192.168.10.2 的机器上访问 10.1 的 Mysql 了, 如下:

msyql> mysql -uuser1 -p123456 -h192.168.10.1;

Mysql bin-log 日志

开启 bin-log 二进制日志, 它保存了所有增删改的操作, 以便于数据恢复或同步

修改主服务器 mysql 配置文件:

shawn@Shawn:~$ sudo vi /etc/mysql/my.cnf;

/********** my.cnf **********/

[mysqld]

#开启慢查询日志, 记录查询过长的 sql 语句,以便于优化

log_slow_queries   = /var/log/mysql/mysql-slow.log

#开启 bin-log 日志

log-bin            = /var/log/msyql/mysql-bin.log

添加完成后重启 Mysql 服务

shawn@Shawn:~$ sudo /etc/init.d/mysql restart

现在你可以通过如下命令来查看 bin-log 日志是否成功开启

mysql> show variables like "%log_%";

| log_bin                 | ON        |

| log_slow_queries        | ON        |

如果显示为 ON, 那么就可以在 /var/log/mysql/ 文件夹看到 mysql-bin.000001 二进制文件

关于 bin-log 日志的相关操作:

mysql> flush logs;

此时就会多一个最新的 bin-log 日志

mysql> show master status;

查看最后一个 bin-log 日志, 如下:

+------------------+----------+--------------+------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000002 |      107 |              |                  |

+------------------+----------+--------------+------------------+

mysql> show master logs;

查看所有 bin-log 日志, 如下:

+------------------+-----------+

| Log_name         | File_size |

+------------------+-----------+

| mysql-bin.000001 |      4340 |

| mysql-bin.000002 |       107 |

+------------------+-----------+

mysql> reset master;

清空所有 bin-log 日志

shawn@Shawn:~$ mysqlbinlog /var/log/mysql/mysql-bin.000001 | more

查看 bin-log 日志内容

#如果有字符集问题的话可以执行:

shawn@Shawn:~$ mysqlbinlog --no-defaults /var/log/mysql/mysql-bin.000001

shawn@Shawn:~$ mysqlbinlog /var/log/mysql/mysql-bin.000002 | mysql -uroot -p123123 test;

恢复 mysql-bin.000002 中所有的操作到 test 数据库中

shawn@Shawn:~$ mysqlbinlog /var/log/mysql/mysql-bin.000002 --start-position="193" --stop-position="398" | mysql -uroot -p123123 test;

恢复 mysql-bin.000002 中指定的操作(position)到 test 数据库中

Mysql 主从复制 - 数据同步

到这一步的时候首先确保 Mysql 用户授权已经完成以及 Mysql bin-log 日志已经成功开启

并确保每台服务器的 server-id 是唯一的

再次修改主服务器(192.168.10.1)的 mysql 配置文件:

shawn@Shawn:~$ sudo vi /etc/mysql/my.cnf;

/********** my.cnf **********/

#取消 server-id 注释符号

server-id   = 1

/****************************/

#重启 Mysql 服务

shawn@Shawn:~$ sudo /etc/init.d/mysql restart

到这里, 主服务器的配置已经完成, 很简单

这次我们主要做的是让从服务器同步主服务器的数据, 同步的是将来所有对主服务做的增删改操作, 但是现有主服务器中的大量数据得先手动同步到从服务器, 操作如下:

#清空一下主服务器的 bin-log 日志, (可选: 保险操作, 防止主从 bin-log 日志混乱)

mysql> reset master;

#然后备份导出主服务器中现有的 test 数据库

shawn@Shawn:~$ mysqldump -uroot -p123123 test -l -F > /tmp/test.sql;

-F = flush logs, 生成新的日志文件, 包括 bin-log 日志

-l = lock 数据库, 防止在导出的时候被写入数据, 完成后自动解锁

#完成后把文件传输给从服务器

shawn@Shawn:~$ scp /tmp/test.sql 192.168.10.2:/tmp/

#然后再查询确保一下从服务器已经成功授过权

mysql> show grants for user1@192.168.10.2G

*************************** 1. row ***************************

Grants for user1@192.168.10.2:

GRANT ALL PRIVILEGES ON *.* TO 'user1'@'192.168.10.2'

IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9'

完成后, 现在我们到从服务器 (192.168.10.2) 导入现有的数据:

#清空一下从服务器的 bin-log 日志, (可选: 保险操作)

mysql> reset master;

#然后导入主服务器中现有的数据

shawn@Shawn:~$ mysqldump -uroot -p123123 test -v -f < /tmp/test.sql;

-v = 查看导入的详细信息

-f = 是当中间遇到错误时, 可以 skip 过去, 继续执行下面的语句

当然你也可以用 source 命令导入

好了, 目前为止主服务器(192.168.10.1)和从服务器(192.168.10.2)现有的数据已经成功手动同步

接下来修改从服务器(192.168.10.2)的 mysql 配置文件:

shawn@Shawn:~$ sudo vi /etc/mysql/my.cnf;

/********** my.cnf **********/

#取消 server-id 注释符号, 并修改值

server-id       = 2

#取消 master-host 注释符号, 并修改值

master-host     = 192.168.10.1

#取消 master-user 注释符号, 并修改值

master-user     = user1

#取消 master-password 注释符号, 并修改值

master-password = 123456

#取消 master-port 注释符号, 并修改值, 主服务器默认端口号为: 3306

master-port     = 3306

/****************************/

#重启 Mysql 服务

shawn@Shawn:~$ sudo /etc/init.d/mysql restart

配置文件修改完成, 此时在从服务器中登入自己的 Mysql, 而不是远程登入主服务器(192.168.10.1)

#在从服务器中登入自身的 Mysql

msyql> mysql -uroot -p123123;

#查看是否已经取得同步

msyql> show slave statusG

*************************** 1. row ***************************

Connect_Retry: 60

Master_Log_FIle: mysql-bin.000002

Read_Master_Log_Pos: 106

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Slave_IO_Running 如果是 Yes 的话代表成功从主服务器中同步到 bin-log 日志

Slave_SQL_Running 如果是 Yes 的话代表成功执行 bin-log 日志中的 SQL 语句

此时的 Master_Log_FIle 和 Read_Master_Log_Pos 的值应该对应主服务器中的 show master status 命令的值

Connect_Retry 中的 60 代表每 60 秒就去主服务器同步 bin-log 日志

OK, 如果你看到的是那两个关键的 Yes, 那你就可以去测试了, 在主服务器插入新的数据, 再去从服务器查看, 不出意外的话, 你会兴奋一下, 数据已经同步了

这里再说一下其他经常用到的命令:

#启动复制线程

msyql> start slave

#停止复制线程

msyql> stop slave

#动态改变到主服务器的配置

msyql> change master to

#查看从数据库运行进程

msyql> show processlist

这里也同时说一下操作中的常见错误:

问题: 从数据库无法同步

Slave_SQL_Running 值为 NO, 或 Seconds_Bebind_Master 值为 Null

原因:

一、 程序有可能在 slave 上进行了写操作

二、 也有可能是 slave 机器重启后, 事务回滚造成的

解决方法一:

msyql> stop slave;

msyql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;

msyql> start slave;

解决方法二:

msyql> stop slave;

#查看主服务器上当前的 bin-log 日志名和偏移量

msyql> show master status;

#获取到如下内容:

+------------------+----------+--------------+------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000005 |      286 |              |                  |

+------------------+----------+--------------+------------------+

#然后到从服务器上执行手动同步

msyql> change master to

-> master_host="192.168.10.1"

-> master_user="user1"

-> master_password="123456"

-> master_post=3306

-> master_log_file="mysql-bin.000005"

-> master_log_pos=286;

msyql> start slave;

再次通过 show slave status 查看:

如果 Slave_SQL_Running 的值变为 Yes, Seconds_Bebind_Master 的值为 0 时, 即正常

好了, 如上是我自己在操作中所总结的一些内容, 如有更好的建议, 欢迎留言一起探讨

顺便说一下, 我使用的是 Ubuntu 12.04

<think>我们正在讨论主从(Master-Slave)架构的操作命令。根据之前的引用,我们知道主从复制在Redis、MySQL和ActiveMQ等系统中都有应用。由于用户没有指定具体系统,我将分别给出Redis和MySQL的详细配置命令,因为这两个是数据库中最常见的。ActiveMQ的配置主要是文件共享方式,命令较少,主要是配置文件的修改。 注意:以下命令基于Linux环境,并假设已经安装好相应的服务。 一、Redis主从复制配置命令 根据引用[1]的描述,Redis主从复制配置非常简单,主要是在从节点(Slave)上执行命令。 1. 主节点(Master)配置: Redis主节点默认就是主服务器,通常不需要特殊配置(除非需要设置密码等)。我们假设主节点IP为192.168.0.100,端口6379(默认)。 2. 从节点(Slave)配置: 在从节点的redis.conf配置文件中可以设置,也可以在运行时通过命令设置。 - 配置文件方式: 修改从节点的redis.conf,添加: slaveof 192.168.0.100 6379 如果主节点有密码,还需添加: masterauth <master-password> 然后重启从节点的Redis服务。 - 命令行方式(运行时配置): 连接到从节点的Redis命令行,执行: SLAVEOF 192.168.0.100 6379 如果主节点有密码,需要先执行: CONFIG SET masterauth <master-password> 然后执行SLAVEOF命令。 注意:使用命令行方式配置在重启后会失效,所以生产环境建议使用配置文件方式。 3. 查看复制状态: 在主节点或从节点上执行: INFO replication 4. 断开复制(如果需要): 在从节点上执行: SLAVEOF NO ONE 二、MySQL主从复制配置命令 根据引用[2][3],MySQL主从复制包括以下步骤: 1. 主节点配置: - 修改主节点的MySQL配置文件(my.cnf或my.ini),在[mysqld]部分添加: server-id=1 log-bin=mysql-bin # 启用二进制日志 binlog-do-db=需要复制的数据库名 # 可选,如果不指定则复制所有数据库 - 重启MySQL服务。 - 登录主节点MySQL,创建用于复制的用户并授权: CREATE USER 'repl'@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; - 查看主节点状态,记录File和Position: SHOW MASTER STATUS; 2. 从节点配置: - 修改从节点的MySQL配置文件,在[mysqld]部分添加: server-id=2 # 必须唯一,不能与主节点相同 - 重启MySQL服务。 - 登录从节点MySQL,执行复制配置命令(使用主节点状态中的File和Position): CHANGE MASTER TO MASTER_HOST='192.168.0.127', MASTER_USER='repl', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=481; - 启动复制: START SLAVE; - 查看从节点状态: SHOW SLAVE STATUS\G 注意查看Slave_IO_Running和Slave_SQL_Running是否为Yes。 3. 停止复制(如果需要): 在从节点上执行: STOP SLAVE; 4. 重置复制(如果需要重新配置): 在从节点上执行: RESET SLAVE; 三、ActiveMQ主从配置(基于共享存储) 根据引用[4],ActiveMQ的共享存储主从配置主要是修改配置文件,而不是命令行。 1. 配置步骤: - 在多个ActiveMQ实例的配置文件中(activemq.xml),配置共享的持久化目录(如kahadb目录)。 - 将每个实例的<persistenceAdapter>中的目录设置为同一个共享目录(如/opt/kahadb)。 - 确保每个实例的brokerName相同(因为它们是同一个broker的主从)。 - 分别启动各个ActiveMQ实例,其中一个会成为Master(通过获取共享目录的锁),其他为Slave。 由于ActiveMQ的主从配置主要是文件配置,所以没有像数据库那样的命令行复制控制。 总结:主从复制的详细操作命令因系统而异,以上分别介绍了Redis、MySQL和ActiveMQ的配置命令。在实际操作中,请根据具体环境调整IP、端口、目录等参数。 §§相关问题§§ 1. 如何验证主从复制是否配置成功? 2. 主从复制配置失败时如何排查问题? 3. 主从切换(故障转移)有哪些常用方法? </think>### 主从(Master-Slave)架构详细操作命令 以下是Redis、MySQL、ActiveMQ三种典型场景下的主从配置命令及操作步骤,基于引用内容整理: --- #### **一、Redis主从复制命令** **1. 主节点(Master)配置** 无需特殊命令,启动即为主节点: ```bash redis-server /path/to/redis.conf ``` **2. 从节点(Slave)配置** - **命令行实时配置**: ```bash # 连接从节点Redis redis-cli SLAVEOF <master_ip> <master_port> # 如 SLAVEOF 192.168.0.100 6379 ``` - **配置文件永久生效**: 修改`redis.conf`: ```ini slaveof <master_ip> <master_port> masterauth <password> # 若主节点有密码 ``` **3. 复制流程控制** | 命令 | 作用 | |------|------| | `PSYNC` | SlaveMaster发起同步请求(自动触发)[^1] | | `BGSAVE` | Master生成RDB快照用于全量复制(后台执行)[^1] | | `INFO REPLICATION` | 查看主从复制状态(角色、偏移量等) | --- #### **二、MySQL主从复制命令** **1. 主节点(Master)配置** ```sql -- 启用二进制日志 SET GLOBAL server_id = 1; SHOW MASTER STATUS; -- 记录File和Position -- 创建复制账号 CREATE USER 'repl'@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; ``` **2. 从节点(Slave)配置** ```sql -- 指向主节点 CHANGE MASTER TO MASTER_HOST = '192.168.0.127', MASTER_USER = 'repl', MASTER_PASSWORD = 'password', MASTER_LOG_FILE = 'mysql-bin.000001', -- 主节点SHOW MASTER STATUS结果 MASTER_LOG_POS = 481; -- 启动复制 START SLAVE; SHOW SLAVE STATUS\G -- 检查Slave_IO_Running: Yes ``` **3. 常用管理命令** | 场景 | 命令 | |------|------| | 暂停复制 | `STOP SLAVE;` | | 重置复制 | `RESET SLAVE ALL;` | | 跳过错误 | `SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;` | --- #### **三、ActiveMQ主从共享存储配置** **1. 配置文件修改** 修改所有节点的`activemq.xml`,指定共享目录: ```xml <persistenceAdapter> <kahaDB directory="/opt/shared_kahadb"/> <!-- 所有节点使用同一目录 --> </persistenceAdapter> ``` **2. 节点启动** ```bash # 分别启动多个ActiveMQ实例 ./bin/activemq start ``` - **自动选举**:首个锁定共享目录的节点成为Master,其他为Slave[^4] - **故障切换**:Master宕机后,剩余节点自动竞争目录锁,新Master接管 --- ### 关键注意事项 1. **数据一致性** - MySQL/Redis:需确保主从`server_id`唯一(避免冲突)[^2][^3] - ActiveMQ:共享目录需所有节点可读写(如NFS)[^4] 2. **复制监控** - MySQL:`SHOW SLAVE STATUS`中的`Seconds_Behind_Master`字段监测延迟 - Redis:`INFO replication`查看`master_repl_offset`与`slave_repl_offset`差值 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值