Mysql主从复制
windows使用压缩包安装:
(1)配置环境变量MYSQL_HOME
(2)创建文件my.ini
[mysqld]
# set basedir to your installation path
port=3306
basedir=D:\mysql8\mysql-8.0.23-winx64
# set datadir to the location of your data directory
datadir=D:\mysql8\mysql-8.0.23-winx64\mydata\data
default-time-zone='+8:00'
(3)
mysqld --initialize --console
mysqld --install MySQL
net start MySQL
mysql -uroot -p
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'lzq12345678';
linux安装
0.从清华大学镜像源(https://mirrors.tuna.tsinghua.edu.cn)下载mysql
wget https://mirrors.tuna.tsinghua.edu.cn/mysql/downloads/MySQL-8.0/mysql-8.0.26-1.el7.x86_64.rpm-bundle.tar
1.解压
tar xvf mysql-8.0.26-1.el7.x86_64.rpm-bundle.tar
2.安装
(方式一:分步安装。推荐)
# 删除之前残留的mysql
rpm -aq | grep mariadb
rpm -e mariadb-libs* --nodeps(其中--nodeps是删除依赖)
rpm -e postfix*
yum localinstall mysql-community-common…
yum localinstall mysql-community-libs…
yum localinstall mysql-community-client…
yum localinstall mysql-community-server…
rpm -ql mysql-community-server
(方式二)
yum install mysql-community-{server,client,common,libs}-*
3.防火墙开放3306端口(非必须)
systemctl start firewalld
firewall-cmd --zone=public --permanent --add-port=3306/tcp
firewall-cmd --reload
4.修改mysql配置文件
vim /etc/my.cnf
>>>>>>
[mysqld]
bind_address = 0.0.0.0
#port=3306
default-time-zone='+8:00'
skip-name-resolve = ON
>>>>>>
5.启动mysql
systemctl start mysqld
# 查看mysql初始密码
grep 'temporary password' /var/log/mysqld.log
6.使用初始密码登录mysql
mysql -uroot -p
# 修改mysql本地登录密码
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'abc123!Test';
# 设置mysql远程登录
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'abc123!Test' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;
---------------------------自此,数据库安装完毕----------------
7.设置mysql密码等级(非必须)
mysql> SHOW VARIABLES LIKE 'validate_password%';
mysql> set global validate_password_policy=LOW;
8.创建mysql新用户
mysql> create user zyf@"%" identified by 'abc123!Test';
mysql> GRANT ALL privileges ON *.* TO "zyf"@"%";
mysql> FLUSH PRIVILEGES;
(用户创建、授权完毕)
mysql> use mysql
mysql> select host, user from user;
mysql> GRANT SELECT,INSERT ON *.* TO 'testUser'@'localhost' IDENTIFIED BY 'testPwd' WITH GRANT OPTION;
9.创建新数据库
mysql> create database zyfdb;
mysql> use zyfdb;
mysql> show databases;
mysql> show tables;
mysql> create table zyftest (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name
varchar(100), create_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
----------------------自此,数据库新用户、新库、新表创建完毕~------------------------------
(以下忽略)
10.
dba.deploySandboxInstance(3307);
11.
dba.configureReplicaSetInstance('root@localhost:3306',{clusterAdmin: "rsadmin@localhost"});
主从复制
一、介绍
1.主机master将自己的写操作信息写到BinaryLog文件中,然后从机slaver读取这个BinaryLog,但并不是立即写入到从机的数据库中,而是写在了从机的Relay Log中。RelayLog写好之后再写入到从机中。
2.每个slave只能有一个唯一的服务器ID。
二、搭建过程
主机与从机的配置都是在my.ini(windows)或my.cnf(linux)配置文件中的[mysqld]节点下操作,各项参数都是小写字母。
(必须)主机设置服务器的唯一id:server-id=1
(必须)启用二进制日志(启用binaryLog日志):log-bin=xxx/mysqlbin
(建议不要放在和mysql同一个位置下。这个路径的最后一项是文件名,为不是文件夹名)- (可选)启用错误日志:log-err=D:\mysql8\data\mysqlerr
- (可选)根目录:basedir=D:\mysql8
- (可选)临时目录:tmpdir=D:\mysql8
- (可选)数据目录:datadir=自己本地路径\Data\
- read-only=0:主机读写都可以
- (可选)binlog-ignore-db=mysql:设置不要复制的数据库
binlog-do-db=需要复制的数据库的名字(这里写上要复制的数据库的名字,不要建立数据库,因为在从机向主机拉取数据,主从搭建之前建立数据库的话,从机会报数据库已经存在的错误) - 10.binlog_format=STATEMENT(默认)
额外补充的知识:三种格式:
- STATEMENT,如update xxx set xx time = now(),因为使用了时间函数会导致主机与从机的时间不一致
- ROW,如123 ——> 456。它记录了行数据的变化。但是弊端在于效率低下
- MIXED:有函数就使用ROW,否则使用STATEMENT。但弊端在于SQL中有系统变量就会存在主从不一致
Example:
主机(Linux)
- 事先创建文件夹:/opt/mysql8/data/,用来存放mysql的二进制操作文件。然后再为mysql8文件夹改变用户组:
[root@iZ2zea3c7u9cgqfjibsmdzZ opt] mkdir -p mysql8/data/
[root@iZ2zea3c7u9cgqfjibsmdzZ opt] chown mysql:mysql -R mysql8
- 编辑/etc/my.cnf文件:
[mysqld]
# set basedir to your installation path
server-id=1
log-bin=/opt/mysql8/data/mysqlbin
#log-err=D:\mysql8\data\mysqlerr
port=3306
basedir=/opt/mysql8
tmpdir=/opt/mysql8
# set datadir to the location of your data directory
datadir=/opt/mysql8/mydata/data
default-time-zone='+8:00'
binlog-ignore-db=mysql
binlog-do-db=mydb
从机(Linux)
- 从机修改my.cnf
[mysqld]
server-id=2
relay-log=mysql-relay
#skip-grant-tables
bind_address=0.0.0.0
#port=3306
default-time-zone='+8:00'
skip-name-resolve=ON
#log-bin=mysql-bin
- 主机与从机都重启(必要时把两者的防火墙都关掉)
systemctl restart mysqld
主机
创建一个可以远程登录的用户,使得从机登录此用户来更新主机的数据。
mysql> CREATE USER slave01 @"%" IDENTIFIED BY 'slave01';
mysql> GRANT REPLICATION SLAVE ON *.* TO "slave01"@"%";
mysql> FLUSH PRIVILEGES;
- 开始主从复制
(1) 主机:
主机创建一个库。CREATE TABLE...
主机 mysql> SHOW MASTER STATUS;
参数解释:
- File:主机的bin文件名
- Position:主机的bin文件的Position
- Binlog_Do_DB:需要主从复制的数据库
- Binlog_ingore_DB:不需要主从复制的数据库
(2)从机:
从机:mysql> CHANGE MASTER TO MASTER_HOST = '主机ip',
MASTER_USER = '主机用户A',
MASTER_PASSWORD = '主机用户A的密码',
MASTER_LOG_FILE = '主机的bin文件名',
MASTER_LOG_POS = 主机的bin文件的Position;
(2)启动从机的复制功能
mysql> start slave
查看
mysql> show slave status\G
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.129.244
Master_User: slave01
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysqlbin.000004
Read_Master_Log_Pos: 156
Relay_Log_File: mysql-relay.000002
Relay_Log_Pos: 323
Relay_Master_Log_File: mysqlbin.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
注意:Slave_IO_Running与 Slave_SQL_Running都为YES代表主从复制建立成功
。
四、排错
(1)The replication receiver thread cannot start because the master has GTID_MODE = OFF and this server has GTID_MODE = ON.
通过MHA从库查看show slave status \G;会提示如下报错!
Last_IO_Error: The replication receiver thread cannot start because the master has GTID_MODE = ON and this server has GTID_MODE = OFF.
mysql> set global gtid_mode=on;
ERROR 1788 (HY000): The value of @@GLOBAL.GTID_MODE can only be changed one step at a time: OFF <-> OFF_PERMISSIVE <-> ON_PERMISSIVE <-> ON. Also note that this value must be stepped up or down simultaneously on all servers. See the Manual for instructions.
mysql> set global gtid_mode=OFF_PERMISSIVE;
Query OK, 0 rows affected (0.00 sec)
mysql> set global gtid_mode=ON_PERMISSIVE;
Query OK, 0 rows affected (0.02 sec)
mysql> set global gtid_mode=ON; 开启gtid之前 ,必须设置enforce_gtid_consistency=on
ERROR 3111 (HY000): SET @@GLOBAL.GTID_MODE = ON is not allowed because ENFORCE_GTID_CONSISTENCY is not ON.
mysql> set global enforce_gtid_consistency=on;
Query OK, 0 rows affected (0.00 sec)
mysql> set global gtid_mode=ON;
Query OK, 0 rows affected (0.01 sec)
再次输入start slave开启MHA的主从数据同步
(2)MySQL 出现 Could not initialize master info structure
修复:reset slave
(3)navicat连接异常 authentication plugin ‘caching_sha2_password’
问题解决
ALTER USER ‘root’@‘localhost’ IDENTIFIED WITH mysql_native_password BY ‘123456’;
(4)安装mysql后在/var/log/mysqld.log 中找不到临时密码
rm -rf /var/lib/mysql
systemctl restart mysqld
grep 'temporary password' /var/log/mysqld.log