MySQL Replication配置

1 配置MySQL服务

2 配置 Replication

2.1 设置主(master)

2.2 设置从(slave)

3 测试主从

MySQL Replication配置

MySQL Replication又称“AB复制”或者“主从复制”,他主要用于MySQL的实时备份或者读写分离。在配置之前先做一下准备工作:配置两台MySQL服务器,或者一台服务器配置两个端口。本次实验为一台服务器上运行两个MySQL。

1 配置MySQL服务

之前搭建了3306端口的MySQL,现搭建3307的MySQL

# cd /usr/local/
# cp -r mysql mysql_2
# cd mysql_2
# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql2

完整搭建MySQL代码(上面配置出错再回来看):

# /usr/local/src/
# wget http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz
# tar zxvf mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz
# mv mysql-5.6.35-linux-glibc2.5-x86_64 /usr/local/mysql
# useradd -s /sbin/nologin mysql
# cd /usr/local/mysql
# mkdir -p /data/mysql
# chown -R mysql:mysql /data/mysql
# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql
​
# cp support-files/my-default.cnf /etc/my.cnf
# vim /etc/my.cnf               //修改参数
innodb_buffer_size = 128M
log_bin = aminglinux
​
basedir = /usr/local/mysql
datadir = /data/mysql
port = 3306
server_id = 128
socket = /tmp/mysql.sock
​
join_buffer_size = 128M
sort_buffer_size = 2M
red_rnd_buffer_size = 2M
​
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
​
# cp support-files/mysql.server /etc/init.d/mysqld
# chmod 755 /etc/init.d/mysqld
# vim /etc/init.d/mysqld
datadir=/data/mysql
# chkconfig --add mysqld
# chkconfig mysqld on
# service mysqld start
# ps aux |grep mysqld

  

 

然后初始化数据库目录,显示两个“OK”并生成/data/mysql2目录才正确;错误请查看15章详细步骤。

复制配置文件到/usr/local/mysql_2目录下

# cp /etc/my.cnf    ./my.cnf
# vim my.cnf            //修改部分参数
log_bin = aminglinux2
basedir = /usr/local/mysql_2
datadir = /data/mysql2
port = 3307
server_id = 129
socket = /tmp/mysql2.sock

  

复制启动脚本并编辑

# cp support-files/mysql.server /etc/init.d/mysqld2
# vim /etc/init.d/mysqld2   //改
basedir=/usr/local/mysql_2
datadir=/data/mysql2
$bindir/mysqld_safe --defaults-file=$basedir/my.cnf --datadir="$datadir" --pid-file="$mysql_pid_file_path" $other_args >/dev/null &
第三行为启动命令,增加了--defaults参数,若不增加则不能正确找到mysql_2的配置文件。

  


启动两个MySQL:

# /etc/init.d/mysqld start
# /etc/init.d/mysqld2 start
# netstat -lnp |grep mysql
tcp6        0       0   :::3306     :::*        LISTEN      21388/mysqld
tcp6        0       0   :::3307     :::*        LISTEN      21787/mysqld
unix    2   [ ACC ]     STREAM  LISTENING   154331  21787/mysqld    /tmp/mysql2.sock
unix    2   [ ACC ]     STREAM  LISTENING   152879  21388/mysqld    /tmp/mysql.sock

2 配置 Replication

打算把3307端口的MySQL作为主(master),把3306的MySQL作为从(slave)。为了让实验更接近生产环境,先在master上创建一个库aming。

# mysql -uroot -S /tmp/mysql2.sock
mysql> create database aming;
mysql> quit

-S(大写)后面指定MySQL的socket文件路径,这也是登录MySQL的一种方法。因为一台服务器上运行两个MySQL端口,所以用-S这样的方法来区分。

然后先把mysql库的数据复制给aming库,如下:

# mysqldump -uroot -S /tmp/mysql2.sock mysql > /tmp/aming.sql
# mysql -uroot -S /tmp/mysql2.sock aming < /tmp/aming.sql

2.1 设置主(master)

上面操作以将mysql_2的配置文件设置过相关的参数

如果还没有设置,请添加:

server_id=129
log_bin=aminglinux2
​
//下面两个参数选择性地使用
binlog-do-db=databasename1,databasename2
binlog-ignore-db=databasename1,databasename2

binlog-do-db=为定义需要复制的数据库,多个数据库用英文的逗号分隔

binlog-ignore-db=定义不需要复制的数据库,这两个参数用其中一个即可。

 

如果修改过配置文件,重启MySQL服务

# /etc/init.d/mysqld2 restart
# mysqladmin -uroot -S /tmp/mysql2.sock password 'aminglinux.com'
# mysql -uroot -S /tmp/mysql2.sock -p
password:
mysql> grant replication slave on *.* to 'repl'@'127.0.0.1' identified by '123lalala';

//这里
repl是为从(slave)端设置的访问主(master)端的用户,也就是要完成主从复制的用户,这里的127.0.0.1为slave的IP(因为配置的master和slave都在本机)

 

锁定数据库写操作

mysql> flush tables with read lock;

查看mester的状态,这些数据要记录,一会在slave端用到:

mysql> show master status;
File        Position    Binlog_Do_DB    Binlog_Ignore_DB    Executed_Gtid_Set
aminglinxu2   652867

 

2.2 设置从(slave)

首先修改slave的配置文件my.cnf

# vim /etc/my.cnf
找到server_id=,设置成和master不一样的数字,若一样会导致后面的操作不成功。
在slave上,也可以选择性地增加如下两行,对应master增加的两行
binlog-do-db=databasename1,databasename2
binlog-ignore-db=databasename1,databasename2
​
# /etc/init.d/mysqld restart

 

复制master上aming库的数据到slave上。master和slave都在一台服务器上,操作很简单。如果是不同机器,需要远程复制(使用scp或rsync)

# mysqldump -uroot -S /tmp/mysql2.sock -p'aminglinux.com' aming > /tmp/amingl.sql
# mysql -uroot -S /tmp/mysql.sock -p123456 -e "create database aming"
# mysql -uroot -S /tmp/mysql.sock -p123456 aming < /tmp/aming.sql

-e:执行MySQL的内部命令。

 

在slave上配置

# mysql -uroot -S /tmp/mysql.sock -p123456
mysql> stop slave;
mysql> change master to master_host='127.0.0.1',
master_port=3307,master_user='repl',
master_password='123lalala',
master_log_file='aminglinux.000003',
master_log_pos=652867;
mysql> start slave;

ps:change master这个命令是一条,逗号接回车键,直到分号才算结束。

 

其中master_log_file和master_log_pos是在前面使用show master status命令查到的数据。

在master上执行(打开两个终端分别运行MySQL):

# msyql -uroot -S /tmp/mysql2.sock -p'aminglinux.com' -e 'unlock tables'

 

在slave端查看slave的状态

mysql> show slave status\G;
...
Slave_IO_Running: Yes
Slave_SQL_Runing: Yes
...
Second_behind_Master: 0     //为主从复制延迟的时间
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:

如果主不正常,需要看这里的error信息。

3 测试主从

在master上执行

# mysql -uroot -S /tmp/mysql2.sock -p 'aminglinux.com' aming
mysql> select count(*) from db;
count(*)
    2
mysql> truncate table db;               //清空表数据
mysql> select count(*) from db;
count(*)
    0

清空了aming.db表的数据库。

查看slave上该表的数据:

# mysql -uroot -S /tmp/mysql.sock -p123456 aming
mysql> select count(*) from db;
count(*)
    0

 

slave上的数据也被清空了。

但好像不太明显,不妨在master上继续删除db表:

mysql> drop table db;

再从slave查看:

mysql> select * from db;
ERROR 1146 (42S02): Table 'aming.db' doesn't exist

 

这次很明显了,db表不见了。主从配置起来虽然很简单,但这种机制非常脆弱,一旦我们不小心在slave上写了数据,那么主从复制也就被破坏了。

另外,如果重启master,务必要先关闭slave,即在slave上执行slave stop命令,然后再去重启master的MySQL服务,否则主从复制很有可能就会中断。重启master后,我们还需要执行start slave命令开启主从复制的服务。

 

出处:《跟阿铭学Linux》

 

posted @ 2021-02-21 20:23  破碎的屋檐  阅读(273)  评论(0编辑  收藏  举报