linux配置 mysql 主从

模拟环境:

主(master)服务器IP:192.168.1.10

从(slave)服务器1IP:192.168.1.11

从(slave)服务器2IP:192.168.1.12

同步的数据库:dbName

一、配置主(master)服务器

1、打开mysql配置文件

PS:一般是/etc/my.cnf,如果忘记当时编译时填的地址或者不知道的话,可以使用以下命令找出当前mysql命令用的配置文件

[root@master ~]# which mysql

[root@master ~]# /usr/bin/mysql --verbose --help | grep -A 1 'Default options'

结果类似如下:

[root@master ~]# vim /etc/my.cnf

 2、在[mysqld](没有这个就手动入进去)下面加入以下代码:

server-id = 1 #数据库ID号, 为1时表示为Master,其中master_id必须为1到232–1之间的一个正整数值;
read-only = 0  #主机,读写都可以
binlog-do-db = dbName   #需要同步的数据库库名,多个写多行

binlog-ignore-db = mysql #不需要同步的库,mysql这个库不用同步

binlog_format=mixed  #设置主从复制模式

log-bin=mysql-bin  #设定生成的log文件名

PS:以上binlog-do-db和binlog-ignore-db两个选项有一定的缺陷,原因及处理办法在上一篇日志有详细说明

保存退出

 3、建立从(slave)服务器用于同步的帐号

[root@master ~]# mysql -h127.0.0.1 -udbUser -pdbPwd

mysql>GRANT REPLICATION SLAVE ON *.* TO slaveUserName1@192.168.1.11 IDENTIFIED BY 'slavePasswd1';

mysql>GRANT REPLICATION SLAVE ON *.* TO slaveUserName2@192.168.1.12 IDENTIFIED BY 'slavePasswd2';

PS:如果想要在Slave上有权限执行 "LOAD TABLE FROM MASTER" 或 "LOAD DATA FROM MASTER" 语句的话,必须授予全局的 FILE 和 SELECT 权限,语句更改如下:

mysql>GRANT FILE,SELECT,REPLICATION SLAVE ON *.* TO slaveUserName1@192.168.1.11 IDENTIFIED BY 'slavePasswd1';

mysql>GRANT FILE,SELECT,REPLICATION SLAVE ON *.* TO slaveUserName2@192.168.1.12 IDENTIFIED BY 'slavePasswd2';

4、重启主服务器Mysql

[root@master ~]# service mysqld restart

重启Mysql有各种手段,不多举例了。。

5、查看主服务器状态,是否设置成功

[root@master ~]# mysql -h127.0.0.1 -udbUser -pdbPwd

mysql> show master status\G

显示结果如下:

*************************** 1. row ***************************
                      File: mysql-bin.000013
               Position: 1090

     Binlog_Do_DB: dbName
Binlog_Ignore_DB: mysql
1 row in set (0.00 sec)

到此主服务器已经配置完成了!!

 

二、配置从(slave)服务器

1、检查主服务器新建的同步帐号是否可用

[root@slave1 ~]# mysql -h 192.168.1.10 -uslaveUserName1 -pslavePasswd1

如果能够登陆成功,则说明设置是成功的;如果不成功,则到主服务器重新设置。然后查看用户是否具有相应权限

mysql>SHOW GRANTS;

2、打开mysql配置文件

 方法同主服务器配置方法

3、在[mysqld](没有这个就手动入进去)下面加入以下代码:

server-id=2 #如果以后要再加Slave号接着往后数就OK了
log-bin=mysql-bin  #设定2进制log文件名
master-host=192.168.1.10 #主服务器IP
master-user=slaveUserName1#用于同步的用户名
master-password=slavePasswd1 #用于同步的用户名的密码
master-port=3306 #同服务器mysql端口
master-connect-retry=60 #如果发现主服务器断线,重新连接的时间差

replicate-do-db=dbName #需要同步的数据库库名
replicate-ignore-db=mysql #不同步的数据库库名
log-slave-update
slave-skip-errors

保存退出

4、重启从服务器Mysql

[root@slave1 ~]# service mysqld restart

从服务器配置完成!!

 

三、将主服务器要同步的数据库传到各个从服务器

1、打开主服务器

切换到mysql数据文件存放目录,我写的这个目录是mysql默认数据存放目录,根据自己情况改写

[root@master ~]# mysql -h127.0.0.1 -udbUser -pdbPwd

mysql>FLUSH TABLES WITH READ LOCK;

PS:不要退出这个终端,否则这个锁就不生效了。以下代码另开终端执行:

[root@master ~]#cd /var/lib/mysql

[root@master ~]# tar zcvf dbName.tar.gz dbName

2、打开从服务器

[root@slave1 ~]# cd /var/lib/mysql/

[root@slave1 ~]# scp root@192.168.1.10:/var/lib/mysql/dbName.tar.gz dbName.tar.gz

传文件有各种手段,不多举例

[root@slave1 ~]# tar zxvf dbName.tar.gz

[root@slave1 ~]# rm -f dbName.tar.gz

 

四、启动slave及查看主/从服务器状态

1、从服务器启动slave并查看状态

[root@slave1 ~]# mysql -h127.0.0.1 -udbUser -pdbPwd

mysql> slave start;

mysql> show slave status\G

类似结果如下:

*************************** 1. row ***************************
             Slave_IO_State: Waiting for master to send event
                Master_Host: 192.168.1.10
                Master_User: slaveUserName1
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.000013
        Read_Master_Log_Pos: 1090
             Relay_Log_File: x1-relay-bin.000017
              Relay_Log_Pos: 235
      Relay_Master_Log_File: mysql-bin.000013
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
            Replicate_Do_DB: masterTest
        Replicate_Ignore_DB: mysql

*****省略N行*******

我们要看其中的Master_Host、Master_User、Master_Port、Master_Log_File是否符合主服务器相关情况,Master_Log_File应该和主服务器show master status\G结果中的File一致。

情况一:Slave_IO_Running显示connecting..

这个是正常的,因为主库服务器还是锁表状态,解锁之后执行以下两部恢复正常:

mysql> slave stop;

mysql> slave start;

情况二:上述变量值某项不符合不符合主服务器情况。处理办法如下:

[root@slave1 ~]# mysql -h127.0.0.1 -udbUser -pdbPwd

mysql> slave stop;

PS:修改配置之前都要将slave停掉

mysql>change master to master_host='192.168.1.10', master_user='slaveUserName1', master_password='slavePasswd1', master_port=3306;

mysql>flush privileges;

mysql>slave start;

 情况三:Slave_IO_Running和Slave_SQL_Running其中一项为No,处理办法如下:

[root@slave1 ~]# mysql -h127.0.0.1 -udbUser -pdbPwd

mysql> slave stop;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> slave start;

2、一切正常之后,解锁主服务器的表

 打开刚刚作锁表操作没有关闭的主服务器终端,执行如下命令:

mysql>UNLOCK TABLES;

如果Slave_IO_Running和Slave_SQL_Running不全为Yes,那么执行以下语句:

mysql> slave stop;

mysql> slave start;

 

如果在使用过过程中,发现突然不同步了,下面是解决办法:

 

情况一、从服务器上show slave status\G中Last_IO_Error报错;Got fatal error 1236 from masterwhen reading data from binary log

1、  在从服务器上登陆mysql

mysql>stop slave;

2、  在主服务器上登陆mysql

mysql>flushlogs;

mysql>showmaster status;

记录下“File”和“Position”两项的值,此处以$fileName和$position代称

3、  在从服务器上登陆mysql

mysql>CHANGEMASTER TO MASTER_LOG_FILE=’log-bin.00000X’, MASTER_LOG_POS=106;

              log-bin.00000X为$fileName,106为$position。

              mysql>start slave;

转载自:http://hi.baidu.com/tianliao1988/item/f750d5f7e3b2af0fd99e7244


### 配置 MySQL 主从复制备份 #### 1. 环境准备 在配置 MySQL 主从复制之前,需要确保两台服务器已经正确设置了主机名映射。可以通过编辑 `/etc/hosts` 文件来完成域名解析[^2]。 ```bash vim /etc/hosts ``` 添加如下内容: ``` 192.168.126.141 mysql-master 192.168.126.139 mysql-slave ``` 这一步是为了让主节点 `mysql-master` 和从节点 `mysql-slave` 能够通过名称互相访问。 --- #### 2. 安装 MySQL 在开始配置前,需确认两台服务器均已安装相同版本的 MySQL 数据库。如果尚未安装,则按照以下步骤操作。 ##### 2.1 检查并清理旧版 MySQL 运行以下命令检查是否存在已安装的 MySQL 版本,并清除残留文件[^3]。 ```bash [root@localhost ~]# rpm -qa | grep mysql ``` 若有输出结果,表示存在旧版 MySQL,可以使用以下命令卸载: ```bash [root@localhost ~]# yum remove $(rpm -qa | grep mysql) ``` 接着删除可能存在的目录和文件: ```bash rm -rf /usr/lib64/mysql /usr/share/mysql find / -name mysql | xargs rm -rf ``` --- #### 3. 配置 Master 节点 (主节点) ##### 3.1 修改 my.cnf 配置文件 编辑 MySQL配置文件 `/etc/my.cnf` 或 `/etc/mysql/my.cnf`,增加或修改以下参数: ```ini [mysqld] server-id=1 log-bin=mysql-bin binlog-do-db=testdb # 只同步 testdb 这个数据库的数据 expire_logs_days=7 # 设置二进制日志保留时间 innodb_flush_log_at_trx_commit=1 sync_binlog=1 # 提升数据一致性 ``` 保存后重启 MySQL 服务使更改生效: ```bash systemctl restart mysqld ``` ##### 3.2 创建用于同步的账号 登录到 MySQL 并创建一个专门用于主从同步的用户账户: ```sql CREATE USER 'repl'@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; FLUSH PRIVILEGES; ``` 记录下该用户的用户名 (`repl`) 和密码 (`password`),稍后会在 Slave 上使用。 ##### 3.3 获取当前 Binlog 日志位置 执行以下 SQL 查询获取当前的 binlog 文件名及其偏移量: ```sql SHOW MASTER STATUS; ``` 输出类似于: | File | Position | Binlog_Do_DB | |--------------|----------|--------------| | mysql-bin.001| 123 | testdb | 记住这些信息,因为它们将在后续配置中被用到。 --- #### 4. 配置 Slave 节点 (从节点) ##### 4.1 修改 my.cnf 配置文件 同样编辑 `/etc/my.cnf` 文件,在 `[mysqld]` 下新增以下内容: ```ini [mysqld] server-id=2 relay-log=mysql-relay-bin read-only=1 # 将此实例设为只读模式 replicate-do-db=testdb # 同步指定数据库 ``` 完成后重启 MySQL 服务: ```bash systemctl restart mysqld ``` ##### 4.2 配置主从关系 连接至 Slave 节点上的 MySQL 实例,执行以下命令建立主从关联: ```sql CHANGE MASTER TO MASTER_HOST='mysql-master', MASTER_USER='repl', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.001', -- 替换为主节点查询得到的日志文件名 MASTER_LOG_POS=123; -- 替换为主节点查询得到的位置编号 START SLAVE; ``` 验证主从状态是否正常启动: ```sql SHOW SLAVE STATUS\G ``` 重点关注以下几个字段: - `Slave_IO_Running`: 应显示为 Yes; - `Slave_SQL_Running`: 应显示为 Yes。 如果均为 Yes,则说明主从复制成功开启。 --- #### 5. 测试主从复制功能 在 Master 节点上向目标数据库写入一些测试数据,观察其能否自动同步到 Slave 节点。例如: ```sql USE testdb; CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL ); INSERT INTO users(username) VALUES('test_user'); ``` 随后查看 Slave 节点中的对应表结构及数据是否一致。 --- ### 总结 MySQL 主从复制的核心在于将 Master 执行的操作以二进制日志的形式传递给 Slave,并由后者重新应用相同的变更过程[^4]。上述方法涵盖了完整的部署流程,包括环境初始化、配置调整以及最终的状态检验环节。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值