前言
网上关于MySQL的主从配置教程相当多,但也不乏很多的坑。这里只留作笔记使用。
测试环境
-
2台或以上Linux服务器 为了篇幅,这里只用2台。 master主服务器地址:192.168.1.2 slave从服务器地址:192.168.1.3
-
OS Debian 8.7
- MySQL Community Server 5.6.35
环境搭建
如果没有安装MySQL服务,可通过官方提供的APT进行安装: 点击下方的download,下载一个deb包的源,然后安装这个deb包,之后更新源,安装mysql-server即可。 具体操作如下:
- 切换到root用户,如果没有该权限的话,使用
sudo
命令也可以,嫌麻烦直接切到root了
# su - root
- 下载、安装APT源
# wget https://dev.mysql.com/get/mysql-apt-config_0.8.1-1_all.deb
# dpkg -i mysql-apt-config_0.8.1-1_all.deb
- 更新APT源,安装MySQL服务
# apt-get update && apt-get install mysql-server
在两台服务器上都做如上步骤,确保安装的MySQL 版本一致即可。
master主服务器配置
编辑mysql配置文件
# vim /etc/mysql/my.cnf
在[mysqld]
下面修改bind-address
的值为192.168.1.2,默认值是127.0.0.1。
继续在[mysqld]
下方添加
character-set-server = utf8 #设置默认数据库编码为utf8,防止乱码问题。
server-id = 1 # 设置服务器标识,非常重要必须唯一。
log_bin = /var/log/mysql/binlog/mysql-bin.log # 开启binlog,主从复制就是基于这个的必须开启。
# binlog_do_db = # 只同步复制指定的数据库,不写默认复制所有数据库
# binlog_ignore_db= # 忽略同步指定的数据库
最后保存退出,重启服务。
# systemctl restart mysql.service
添加同步用户
- 使用mysql root用户登进master数据库:
# mysql -uroot -p
- 创建给slave服务器用来备份的用户
mysql> grant select,insert,update,delete on *.* to child@"%" identified by "lu123";
- 授权给slave服务器
mysql> grant replication slave on *.* to 'child'@'192.168.1.3' identified by 'lu123';
如果是2台或多台slave,这里就还要根据slave服务器IP多授权几次,如:
mysql> grant replication slave on *.* to 'child'@'192.168.1.4' identified by 'lu123';
- 允许远程主机登陆
mysql> GRANT ALL PRIVILEGES ON *.* TO 'child'@'%' IDENTIFIED BY 'lu123' WITH GRANT OPTION;
- 刷新权限
mysql> flush privileges;
- 退出,重启MySQL服务
mysql> exit
# systemctl restart mysql.service
- 再次登录master数据库,查看bin文件和position,后面配置slave需要
# mysql -uroot -p
mysql> show master status;
记住File和Position字段的值。
配置slave服务器
网上很多教程都是在my.cnf上面添加mast-user、mast-post之类的,这些在mysql 5.6之前可以,但是后面就不行了。
首先还是先编辑配置文件
# vim /etc/mysql/my.cnf
在[mysqld]
下面修改bind-address
的值为192.168.1.3,默认值是127.0.0.1。
继续在[mysqld]
下方添加
character-set-server = utf8 #设置默认数据库编码为utf8,防止乱码问题。
server-id = 2 # 设置服务器标识,非常重要必须唯一。
#log_bin = /var/log/mysql/binlog/mysql-bin.log # 开启binlog,主从复制就是基于这个的,如果仅拥有slave服务的话,可以不用开启这个。如果是这个slave还要作为其他slave的master服务器的话就需要开启了
log-slave-updates # 可以让slave扮演其它slave的master
slave-skip-errors=all
slave-net-timeout=60
最后保存退出,重启服务。
# systemctl restart mysql.service
指定master
在slave服务器上,通过mysql客户端登入服务器,依次执行以下命令:
$ mysql -uroot -p
mysql> stop slave;
mysql> change master to master_host='192.168.1.2',master_user='child',master_password='lu123',master_log_file='mysql-bin.000232', master_log_pos=120;
mysql> start slave;
注意:master_log_file和master_log_pos就是我们上面在master服务器通过下面命令所查看到的值:
mysql> show master status;
最后看一下状态,是否有出现错误:
mysql> show slave status \G;
验证
好了,基本上配置都完成了。我们最后再测试验证一下。
- 首先在master主服务器上创建一个数据库和表,并且插入测试数据,看下slave服务器是否有同步过来。
mysql> CREATE DATABASE demo;
mysql> USE demo;
mysql> CREATE TABLE student(id INT PRIMARY KEY AUTO_INCREMENT, name varchar(20));
mysql> INSERT INTO student(name) VALUES ('小明'), ('小卢');
- 然后在slave服务器上登录mysql,并执行以下命令:
mysql> SHOW DATABASES;
mysql> USE demo;
mysql> SHOW TABLES;
mysql> SELECT * FROM student;
执行以上命令,可以查看到在master服务上创建的内容都已经同步到slave上面了。 但是最后需要注意,如果是在slave服务器上的增删查改,其master主服务器是不会同步的。 如果需要两边都同步,那就要做Master-Master结构了,这又是另外一篇啦。
总结
我觉得,一般的小型公司这样的结构就已经差不多足够了,如果是中大型的话,就需要更复杂的架构了。后面需要学习的地方还很多啊,共勉。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/2046.html