mysql-slave(主从)

MySQL主从

注意: 由于MySQL不同版本之间的(二进制日志)bin-log格式可能会不一样,建议Master(主)的MySQL版本和Slave(从)的版本尽可能的相同。
原理: MySQL主从是基于binlog,在主机上需开启binlog才能进行主从;
binlog有三种模式:
Statement: Binlog中存储SQL的语句,存储日志量是最小的。但是,对于user()等函数存在bug
Row: 是主从复制更加安全,但是存储日志量大,但是不能直接进行读取。(默认)
Mixed:介于两者之间,对于不确定的操作使用Row记录。根据SQL语句有系统决定是基于段还是行复制。

大致过程:

a: master主机中的MySQL将更改操作的记录到bin-log(二进制日志文件)里;
b: slave主机将master主机中的的bin-log事件(也就是操作的sql语句)同步到本机上并记录在本机的relay-log里;
c: slave机再根据relay-log里面的sql语句依次按顺序执行

作用:
a: 实时灾备,用于故障切换
b: 读写分离,提供查询服务
c: 实时备份,避免影响业务

实现步骤:

时间同步
###system:    ubuntu-server18.04####
### 主从都需要做#################
apt-get install nptdate -y
ntpdate  0.cn.pool.ntp.org 
时区设置(CST):
mv /etc/localtime /etc/localtime-bak
cp /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime
Master:
sudo apt-get install mysql-server -y
#----------------------------------------------------
##出现以下错##
#E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)#
#E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?#
#可以通过kill -9 杀死所有的apt-get 和apt进程,通过ps -A | grep apt。
#或者,删除锁定文件,何为锁定文件:锁定的文件会阻止 Linux 系统中某些文件或者数据的访问,这个概念也存在于 Windows 或者其他的操作系统中。一旦你运行了 apt-get 或者 apt 命令,锁定文件将会创建于 /var/lib/apt/lists/、/var/lib/dpkg/、/var/cache/apt/archives/ 中。这有助于运行中的 apt-get 或者 apt 进程能够避免被其它需要使用相同文件的用户或者系统进程所打断。当该进程执行完毕后,锁定文件将会删除。
#如果你没有看到 apt-get 或者 apt 进程,但是在上面两个不同的文件夹中看到了锁定文件,这是因为进程由于某个原因被杀掉了,因此你需要删除锁定文件来避免该错误。
#运行sudo rm  -rf  /var/lib/dpkg/lock  命令来移除 /var/lib/dpkg/ 文件夹下的锁定文件
#强制重新配置软件包:	sudo dpkg --configure -a
#同时删除 /var/lib/apt/lists/ 以及缓存文件夹下的锁定文件;sudo rm /var/lib/apt/lists/lock, sudo rm /var/cache/apt/archives/lock
#更新软件包源列表: sudo apt-get update
master配置文件设置
#-----------------------------------------------------
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
			bind-address = 127.0.0.1  更改为: bind-address = IP_Address
			server_id         = 9                # 服务器唯一标识;文件内有,可复制。
			log_bin             = /var/log/mysql/mysql-bin.log     # 启动MySQL二进制日志
			log_bin_index = master-bin.index      #可忽略,不填写。
			binlog_do_db = replicadb						#指定记录二进制日志的数据库,可忽略。
			binlog_ignore_db = mysql						#指定不记录二进制日志的数据库,可忽略。
			# binlog-format = ROW								#默认Row,日志量大,可选MIXED
			#expire_logs_days = 15                            #自动删除15天前的日志。默认值为0,表示从不删除。防止日志过大
#sudo systemctl restart mysql
Master-MySQL 数据库设置
#--------------------------------------------------------
sudo mysql
#查看log_bin是否 开启
show variables like 'log_%'
输出: log_bin                        ON
在MySQL提示符内,运行以下SQL查询,这些查询将创建副本用户并向用户授予REPLICATION SLAVE权限:
CREATE USER 'replica'@'172.19.79.157' IDENTIFIED BY 'replica_password';
CREATE USER 'replica'@'172.19.79.156' IDENTIFIED BY 'replica_password';
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'172.19.79.157;
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'172.19.79.156;
#use mysq;
#select user,host from user;
#+---------------------------+--------------------+
#| user                   				|	 host         			 |
#+---------------------------+--------------------+
#| replica              				| 172.19.79.156  |
#| replica              				| 172.19.79.157  |
#| debian-sys-maint 		| localhost     		 |
#| mysql.session    			| localhost     		 |
#| mysql.sys        				| localhost    		 |
#| root             						| localhost    		 |
#+---------------------------+--------------------+
#6 rows in set (0.00 sec)
#远程登录授权:
update user set host='%' where user='root'
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' identified by 'slave';
#在MySQL提示符内时,执行以下命令将打印二进制文件名和位置。
SHOW MASTER STATUS\G
输出:
*************************** 1. row ***************************
             File: mysql-bin.000001
         Position: 1734
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)
或者使用:SHOW MASTER STATUS
#需要记下文件名'mysql-bin.000001'和位置'1734'。 配置从属服务器时,您将需要这些值。 每个人服务器上的这些值可能会有所不同。
slave-MySQL 配置文件设置
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
			bind-address = 127.0.0.1  更改为: bind-address = IP_Address
			server_id         = 2                # 服务器唯一标识;文件内有,可复制。
			replicate-do-db=replicadb        #要同步的mstest数据库,要同步多个数据库,就多加几个replicate-db-db=数据库名,可选
			relay-log          = slave-relay-bin    #中继日志
			relay-log-index = slave-relay-bin.index
			#read_only = 1			#设置为只读,0为读写
			#log_slave_updates = 1/on  #设置行级复制,作为从库生效
			#relay_log_recovery = 1   #中继日志relay_log可以自我修复
#sudo systemctl restart mysql
slave-MySQL 数据库设置
sudo mysql
#首先,停止slave线程:	
stop slave;
#查看relay_log是否开启:
show variables like '%_log'
#运行以下查询,该查询将设置从服务器来复制主服务器:
	CHANGE MASTER TO
	MASTER_HOST='172.19.79.155',
	MASTER_USER='replica',
	MASTER_PASSWORD='replica_password',
	MASTER_LOG_FILE='mysql-bin.000001',
	MASTER_LOG_POS=1734;
#启动slave线程:
start slave;
#----------------------------------
# master_host对应主服务器的IP地址,
# master_port对应主服务器的端口,
# master_log_file对应show master status显示的File列:master-bin.000001,
# master_log_pos对应Position列:1734
#----------------------------------

查看slave状态信息:

show slave status\G;
在这里插入图片描述
说明:slave_IO_Running和Slave_SQL_Running都为yes才表示同步成功

延伸:binlog日志手动删除和自动清理

#查看binlog日志
show binary logs;
#查看正在使用的日志文件,当前正在使用的日志文件是mysql-bin.0000079,那么删除日志文件的时候应该排除掉该文件。:
show master status;
#删除某个日志文件之前的所有日志文件
purge binary logs to 'mysql-bin.000079';
show binary logs;
#输出:mysql-bin.000079
#删除某个日期之前的所有日志文件
PURGE MASTER LOGS BEFORE '2008-06-22 13:00:00';  
#清理3天前binlog日志BEFORE,变量的date自变量可以为'YYYY-MM-DD hh:mm:ss'格式。这里的清理是指从此刻-3*24*3600s前的文件,是此文件最后更新的时间。
 PURGE MASTER LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 3 DAY);
#重启自动删除:
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
expire_logs_days = 10
#不重启自动删除:
show variables like '%log%';
set global expire_logs_days = 10;
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值