当前位置:   article > 正文

linux 实现mysql数据库主从复制_linux mysql主从复制

linux mysql主从复制

一、mysql主从复制原理

1、master将操作语句记录到binlog日志中,然后授予slave远程连接的权限(master一定要开启binlog二进制日志功能;通常为了数据安全考虑,slave也开启binlog功能)。

2、slave开启两个线程:IO线程和SQL线程。其中:IO线程负责读取master的binlog内容到中继日志relay log里;SQL线程负责从relay log日志里读出binlog内容,并更新到slave的数据库里,这样就能保证slave数据和master数据保持一致了。

3、Mysql复制至少需要两个Mysql的服务,当然Mysql服务可以分布在不同的服务器上,也可以在一台服务器上启动多个服务。

4、Mysql复制最好确保master和slave服务器上的Mysql版本相同(如果不能满足版本一致,那么要保证master主节点的版本低于slave从节点的版本)

5、master和slave两节点间时间需同步

二、安装mysql

1、检查安装环境

1.1、检查是否安装过mysql
  1. [root@localhost ~]# rpm -qa | grep mysql
  2. #如果有就使用 rm -rf 命令删除
  3. [root@localhost ~]# whereis mysql
  4. mysql: /usr/lib64/mysql /usr/share/mysql
  5. [root@localhost ~]# rm -rf /usr/lib64/mysql /usr/share/mysql #删除
  6. [root@localhost ~]# find / -name mysql
  7. /etc/selinux/targeted/active/modules/100/mysql
  8. [root@localhost ~]# rm -rf /etc/selinux/targeted/active/modules/100/mysql #删除
1.2、检查是否有mysql用户

若用户及用户组已存在,则略过这一步,没有则创建

  1. [root@localhost ~]# id mysql
  2. id: mysql: no such user
  3. [root@localhost ~]# groupadd mysql
  4. [root@localhost ~]# useradd -r -g mysql mysql
1.3、检查库文件是否安装
  1. [root@localhost ~]# rpm -qa|grep libaio
  2. libaio-0.3.109-13.el7.x86_64 #我这里已经安装过了,若没有输出,则需要用yum安装
  3. yum install libaio-devel.x86_64
  4. #
  5. yum -y install numactl

2、下载

https://dev.mysql.com/downloads/mysql/

下载完成后 用rz命令上传到 /soft/目录下

3、安装

  1. [root@localhost local]# tar -xvf mysql-8.0.27-linux-glibc2.12-x86_64.tar.xz #解压
  2. [root@localhost local]# mv mysql-8.0.27-linux-glibc2.12-x86_64 mysql-8.0.27 #重命名
  3. #修改mysql 目录下所有文件的所属用户为root 所属组为root
  4. [root@localhost local]# chown -R root:root /soft/mysql-8.0.27/
  5. #创建数据存储目录,用以存储数据库数据
  6. [root@localhost local]# mkdir data
  7. #修改数据存储目录所属用户及所属组为mysql
  8. [root@localhost local]# chown mysql:mysql /soft/mysql-8.0.27/data

4、初始化数据库

在初始化之前请先确认/etc/my.cnf 已经不存在,否则在初始化是mysql会默认读取配置文件作为初始化。

若存在该文件,则如下将其改名,留作备份

  1. [root@localhost mysql]# ll /etc/ | grep my.cnf
  2. -rw-r--r--. 1 root root 570 Jun 8 2017 my.cnf
  3. drwxr-xr-x. 2 root root 31 Dec 20 17:32 my.cnf.d
  4. [root@localhost mysql]# mv /etc/my.cnf /etc/my.cnf.bak
  5. [root@localhost mysql]# ll /etc/ | grep my.cnf
  6. -rw-r--r--. 1 root root 570 Jun 8 2017 my.cnf.bak
  7. drwxr-xr-x. 2 root root 31 Dec 20 17:32 my.cnf.d
  8. #开始初始化
  9. [root@localhost mysql]# /soft/mysql-8.0.27/bin/mysqld --initialize --user=mysql --basedir=/soft/mysql-8.0.27 --datadir=/soft/mysql-8.0.27/data
  10. #注意复制初始化密码 kw1n<XkP:qdh

5、修改配置

  1. #进入MySQL安装目录support-files文件中,创建mysql-default.cnf 文件并添加权限
  2. [root@localhost mysql]# cd /soft/mysql-8.0.27/support-files/
  3. [root@localhost support-files]# touch mysql-default.cnf
  4. [root@localhost support-files]# chmod 777 mysql-default.cnf
  5. #将其复制到/etc/下,改名为my.cnf
  6. [root@localhost support-files]# cp -a mysql-default.cnf /etc/my.cnf
  7. vi /etc/my.cnf
  8. #在my.cnf中添加配置
  9. [mysqld]
  10. basedir = /soft/mysql-8.0.27
  11. datadir = /soft/mysql-8.0.27/data
  12. socket = /tmp/mysql.sock
  13. log-error = /soft/mysql-8.0.27/data/error.log
  14. pid-file = /soft/mysql-8.0.27/data/mysql.pid
  15. port = 3306
  16. max_allowed_packet=32M
  17. #修改配置文件权限,这一句不在My.cnf中,在外面执行
  18. chmod 644 /etc/my.cnf

6、设置开机自启动

  1. #复制mysql服务文件到/etc/init.d/目录下,重命名为mysql
  2. [root@localhost support-files]# cp -a /soft/mysql-8.0.27/support-files/mysql.server /etc/init.d/mysql
  3. #添加可执行权限
  4. [root@localhost support-files]# chmod +x /etc/init.d/mysql
  5. #注册服务
  6. chkconfig --add mysql #注册
  7. chkconfig --list mysql #检测
  8. #/etc/ld.so.conf要配置路径,不然报错
  9. [root@localhost support-files]# vim /etc/ld.so.conf
  10. #在ld.so.conf中添加 mysql 的lib文件
  11. /soft/mysql-8.0.27/lib
  12. #配置环境变量
  13. [root@localhost support-files]# vim /etc/profile
  14. #末尾添加:
  15. export PATH=$PATH:/soft/mysql-8.0.27/bin:/soft/mysql-8.0.27/lib
  16. #重新加载使环境变量生效
  17. [root@localhost support-files]# source /etc/profile
  18. #启动服务
  19. [root@localhost support-files]# service mysql start

7、修改默认密码

  1. #使用初始化密码登录
  2. [root@localhost support-files]# mysql -uroot -p

如果忘记初始密码:

https://zhuanlan.zhihu.com/p/458845050

  1. #修改密码
  2. alter user 'root'@'localhost' identified by 'l***2417';

8、开启远程连接

  1. mysql> use mysql;
  2. mysql> update user set host = '%' where user = 'root';
  3. mysql> flush privileges;
  4. mysql> GRANT ALL ON *.* TO 'root'@'%';
  5. mysql> flush privileges;
  1. #防火墙设置
  2. #暂时关闭防火墙
  3. systemctl stop firewalld
  4. #开放指定端口号
  5. firewall-cmd --zone=public --add-port=8080/tcp --permanent
  6. #移除已开放的端口号
  7. firewall-cmd --zone=public --remove-port=8080/tcp --permanent
  8. #使防火墙设置生效
  9. firewall-cmd --reload

三、数据同步

我们需要一个主节点,即主数据库mysql(为次数据库提供更新日志)

1、开启二进制日志

  1. #主节点配置
  2. #在 /etc/my.cnf中新增以下代码
  3. #开启二进制日志
  4. log_bin=master_bin
  5. #设置当前节点全局唯一ID
  6. server-id=176
  7. #重启mysql服务
  8. service mysql start
  9. #查看从二进制日志的文件和位置开始进行复制(主数据库)
  10. mysql> show master status;
  11. # 查询结果,这个file和position等会需要用
  12. mysql> show master status;
  13. +-------------------+----------+--------------+------------------+-------------------+
  14. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  15. +-------------------+----------+--------------+------------------+-------------------+
  16. | master_bin.000010 | 2397 | | | |
  17. +-------------------+----------+--------------+------------------+-------------------+
  18. 创建有复制权限的用户账号
  19. create user repluser@'10.70.20.%' identified by 'l***2417';
  20. mysql> grant replication slave on *.* to repluser@'10.70.20.%';
  1. #从节点配置
  2. #为当前节点设置一个全局惟的ID号
  3. server_id=177
  4. #开启二进制日志
  5. log-bin=slave_log
  6. #设置从数据库只读(对root用户无效)
  7. read_only=ON
  8. #relay log的文件路径
  9. relay_log=relay-log
  10. #默认值hostname-relay-bin.index
  11. relay_log_index=relay-log.index

2、使用有复制权限的用户账号连接至主服务器,并启动复制线程

  1. # master_host是主数据库的IP地址,master_user是前面创建的角色名,master_password主数据库密码,master_log_file就是上面主数据库查到的file,MASTER_LOG_POS就是上面的position,get_master_public_key是在主数据库配置文件里面设置的id
  2. mysql> change master to master_host='10.70.20.176',master_user='repluser',master_password='l***2417',master_log_file='master_bin.000010',MASTER_LOG_POS=2397,get_master_public_key=176;
  3. mysql> START SLAVE;
  4. mysql> SHOW SLAVE STATUS\G;

此时红框框柱的两项都是yes说明已经完成!如果不是建议先停止同步 stop slave,然后检查change master to...... 这一句是否正确。

四、测试

主数据库新建一个数据库,此时从数据库也会出现相同的数据库,说明主从同步已实现

当前,左右两边数据库都只有这四个:

在主数据库中新建一个数据库db_test:

从数据库查询:

完成

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号