MySQL集群之主从复制环境搭建
安装MySQL
Linux下查看版本信息
-
Linux查看版本当前操作系统内核信息
uname -a # Linux pinyoyougou-docker 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
-
Linux查看当前操作系统版本信息
cat /proc/version # Linux version 3.10.0-514.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC) ) #1 SMP Tue Nov 22 16:42:41 UTC 2016
-
Linux查看版本当前操作系统发行版信息
cat /etc/issue # CentOS Linux release 7.3.1611 (Core)(虚拟机微服务) cat /etc/redhat-release # 或者 # Red Hat Enterprise Linux Server release 6.4 (Santiago)(192.168.101.39)
-
Linux查看cpu相关信息,包括型号、主频、内核信息等
```sh
cat /proc/cpuinfo
```
- Linux查看版本
```sh
getconf LONG_BIT
# 64 (说明当前CPU运行在32bit模式下, 但不代表CPU不支持64bit)
lsb_release -a # 或者
```
Linux下安装MySQL5.6
-
安装包介绍
二进制文件分为两种:一种是不针对特定平台的通用安装方法,使用的二进制文件是后缀为.tar.gz的压缩文件;第二种是使用RPM或其他包进行安装,这种安装进程会自动完成系统的相关配置,本次采用rpm安装包
-
下载地址
https://dev.mysql.com/downloads/mysql/
-
环境准备
-
MySQL-5.6.44-1.el6.x86_64.rpm-bundle.tar
-
CentOS7.0.1406操作系统
-
xshell
-
-
安装步骤
# 卸载老版本MySQL ## 检查系统是否已安装的mysql rpm -qa | grep -i mysql ## 卸载已安装的mysql rpm -e mysql-libs-5.1.66-2.el6_3.x86_64 --nodeps ## --nodeps 表示:不验证套件档的相互关联性 ## 查找并删除mysql有关的文件 find / -name mysql rm -rf /usr/lib64/mysql ## 删除mysql的数据库 # 安装MySQL(rpm方式安装包) ## 上传mysql安装包 /usr/local/mysql ## 解压安装包 tar -xvf MySQL-5.6.44-1.el6.x86_64.rpm-bundle.tar # 在RHEL系统中,必须先安装"MySQL-shared-compat-5.6.44-1.el6.x86_64.rpm"这个兼容包,然后才能安装server和client,否则安装时会出错 ## RHEL兼容包 rpm -ivh MySQL-shared-compat-5.6.44-1.el6.x86_64.rpm # 在CentOS7系统下由于自带了mariadb的依赖,需要先将其删除,再依次安装 ## 查看mariadb依赖 rpm -qa | grep -i mariadb ## mariadb-libs-5.5.35-3.el7.x86_64 ## 移除mariadb的依赖 rpm -e --nodeps mariadb-libs-5.5.35-3.el7.x86_64 ## MySQL服务端程序(我安装这个的时候有个警告,最后加上参数--force --nodeps强制安装的) rpm -ivh MySQL-server-5.6.44-1.el6.x86_64.rpm --nodeps --force ## MySQL客户端程序 rpm -ivh MySQL-client-5.6.44-1.el6.x86_64.rpm ## MySQL的库和头文件 rpm -ivh MySQL-devel-5.6.44-1.el6.x86_64.rpm ## MySQL的共享库 rpm -ivh MySQL-shared-5.6.44-1.el6.x86_64.rpm
-
注意事项
安装成功后会提示默认my.cnf地址
修改mysql默认密码
-
问题描述
# 启动MySQL服务 service mysql start ## 报错 Failed to issue method call: Unit mysql.service failed to load: No such file or directory ## 原因 未卸载mariadb依赖,导致MySQL-server数据库服务端安装失败
-
修改步骤
## 获取MySQL安装时生成的随机密码(ugIGexdBnOhedEHw) cat /root/.mysql_secret ## 启动MySQL服务 service mysql start ## 进入MySQL,使用之前获取的随机密码 mysql -uroot -p ## 在MySQL命令行中设置root账户的密码为123456 SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456'); ## 退出MySQL命令行 quit ## 重新启动MySQL服务 service mysql restart
MySQL设置远程访问
-
问题描述
远程连接mysql时,提示:is not allowed to connect this MySQL server
原因:在数据库服务器中的mysql数据库中的user的表中没有权限(也可以说没有用户)
-
设置步骤
# 设置远程访问 ## 连接服务器 mysql -u root -p ## 看当前所有数据库: show databases ## 进入mysql数据库: use mysql ## 查看mysql数据库中所有的表: show tables ## 查看user表中的数据: select Host, User, Password from user ## 修改user表中的Host: update user set Host='%' where User='root' update user set Host='%' where Host='localhost' ## 或者 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION; ## 最后刷新一下: flush privileges
-
注意事项
https://www.csdn.net/gather_29/MtTaIg1sNzE0OS1ibG9n.html
可能由于防火墙或者端口号不匹配导致不能使用远程客户端连接MySQL,但是在命令行可以连接
MySQL主从复制配置
环境准备
-
服务器准备
Master(192.168.159.134)和 Slave(192.168.159.133) 注意:两台数据库服务器的的 selinux 都要 disable(永久关闭 selinux,请 修改/etc/selinux/config,将 SELINUX 改为 disabled)
本次安装并没有关闭,也能正常安装
-
MySQL准备
Master 和 Slave 都创建数据库 mbank,表 user
create database if not exists mbank default charset utf8 collate utf8_general_ci; use mbank; DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `user_name` varchar(255) NOT NULL DEFAULT '' COMMENT '用户名', `pwd` varchar(255) NOT NULL DEFAULT '' COMMENT '密码', PRIMARY KEY (`Id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='用户信息表';
Master
-
Master端配置
# 修改Master的MySQL配置文件 /etc/my.cnf ## MySQL服务器安装在/usr目录下,只有/usr/my.cnf文件 vim /usr/my.cnf # 在 [mysqld] 中增加以下配置项 # 设置 server_id,一般设置为 IP server_id=134 # 复制过滤:需要备份的数据库,输出 binlog binlog-do-db=mbank # 复制过滤:不需要备份的数据库,不输出(mysql 库一般不同步) binlog-ignore-db=mysql # 开启二进制日志功能,可以随便取,最好有含义 log-bin=edu-mysql-bin # 为每个 session 分配的内存,在事务过程中用来存储二进制日志的缓存 binlog_cache_size=1M # 主从复制的格式(mixed,statement,row,默认格式是 statement) binlog_format=mixed # 二进制日志自动删除/过期的天数。默认值为 0,表示不自动删除。 expire_logs_days=7 # 跳过主从复制中遇到的所有错误或指定类型的错误,避免 slave 端复制中断。 # 如:1062 错误是指一些主键重复,1032 错误是因为主从数据库数据不一 致 slave_skip_errors=1062 # 如果需要同步函数或者存储过程 log_bin_trust_function_creators=true
-
Master数据库服务配置
# 重启Master数据库服务 service mysql restart # root用户登录数据库 mysql -uroot -p # 创建数据同步用户,并授予相应的权限 ## 这里ip配置的是从库ip地址 grant replication slave, replication client on *.* to 'nifc'@'192.168.159.133' identified by '123456'; # 刷新授权表信息 flush privileges; # 查看 MySQL 现在有哪些用户及对应的 IP 权限 select user, host from mysql.user; # 查看 position 号,记下 position 号(从机上需要用到这个 position 号和现 在的日志文件) show master status; ##Master 重启后会修改 mysql-bin 文件名(序号加 1)
Slave
-
Slave端配置
# 设置 server_id,一般设置为 IP server_id=133 # 复制过滤:需要备份的数据库,输出 binlog binlog-do-db=mbank #复制过滤:不需要备份的数据库,不输出(mysql 库一般不同步) binlog-ignore-db=mysql # 开启二进制日志,以备 Slave 作为其它 Slave 的 Master 时使用 log-bin=edu-mysql-slave1-bin # 为每个 session 分配的内存,在事务过程中用来存储二进制日志的缓存 binlog_cache_size = 1M # 主从复制的格式(mixed,statement,row,默认格式是 statement) binlog_format=mixed # 二进制日志自动删除/过期的天数。默认值为 0,表示不自动删除。 expire_logs_days=7 # 跳过主从复制中遇到的所有错误或指定类型的错误,避免 slave 端复制中 断。 # 如:1062 错误是指一些主键重复,1032 错误是因为主从数据库数据不一 致 slave_skip_errors=1062 # relay_log 配置中继日志 relay_log=edu-mysql-relay-bin # log_slave_updates 表示 slave 将复制事件写进自己的二进制日志 ## 当设置 log_slave_updates 时,你可以让 slave 扮演其它 slave 的 master。 此时,slave 把 SQL 线程执行的事件写进行自己的二进制日志 (binary log), 然后,它的 slave 可以获取这些事件并执行它 log_slave_updates=1 # 防止改变数据(除了特殊的线程) read_only=1
-
配置Slave数据库
# 保存后重启MySQL服务,还原备份数据 service mysql restart # 在master那边,执行 ## flush logs命令的作用就是关闭当前使用的binary log,然后打开一个新的binary log文件,文件的序号加1. flush logs; ## 记下File, Position show master status; # 在slave端,执行 ## 暂停slave状态(也可不执行) stop slave; ## 登录mysql mysql -uroot -p ## 此处的master_log_file的值为上面查询的file值,master_log_pos为Position值。 mysql> change master to master_host='192.168.159.134', master_user='nifc', master_password='123456', master_port=3306, master_log_file=' edu-mysql-bin.000001', master_log_pos=1872, master_connect_retry=30; ## 查看主从同步状态 mysql> show slave status\G; ## 可看到 Slave_IO_State 为空, Slave_IO_Running 和 Slave_SQL_Runnin g 是 No,表明 Slave 还没有开始复制过程。 ## 开启主从同步 mysql> start slave; ## 再查看主从同步状态 mysql> show slave status\G; ## 注意:保证各个db的uuid不一样 ## 找到每个实例下data文件夹下的auto.cnf文件,修改里面的uuid值,保证各个db的uuid不一样,重启db即可 find -name auto.cnf ## 本地存放目录 /var/lib/mysql
-
注意事项
MySQL主从同步状态异常1236
## 报错信息:Got fatal error 1236 from master when reading data from binary log: ‘Could not find first log file name in binary log index file’ ## 解决方案 stop slave; reset slave; start slave;
测试主从同步
- Master新增测试数据
-- 创建mbank库、表,并写入一定量的数据,用于模拟现有的业务系统数据库
INSERT INTO `user` (user_name, pwd) VALUES ('yzr','123456'),('test','123456'),('you','654321');
查看Slaver中是否同步新增数据
参考链接
-
MySQL安装包介绍
https://zzjlogin.github.io/Server/linux-server/mysql/0012mysql_package.html
-
Centos7下安装mysql5.6
https://blog.csdn.net/java_lais/article/details/80921556
-
MySQL实现主从复制/主从同步
https://www.jianshu.com/p/19cb0f16dea4
-
MySQL集群(一)之主从复制
https://www.cnblogs.com/yixiaogo/p/11300514.html
-
搭建MySQL5.6主从复制
https://blog.csdn.net/YZR_JAVA/article/details/87115028
-
MySQL5.6主从复制最佳实践
https://www.cnblogs.com/xhyan/p/6598992.html