tar -zxvf mysql-5.7.43-linux-glibc2.12-x86_64.tar.gz
#移动解压后的目录
mv mysql-5.7.43-linux-glibc2.12-x86_64 /usr/local/mysql
mkdir /usr/local/mysql/data
cd /usr/local/mysql
groupadd mysql
useradd mysql -g mysql
#后面的 . 必须要有,否侧会报错,修改不成功
chown -R mysql .
chgrp -R mysql .
/usr/local/mysql/bin/mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --initialize
#最终打印出下面,冒号后面就是初始密码
A temporary password is generated for root@localhost:FCT*pV2Zk
vi /etc/profile
export MYSQL_HOME="/usr/local/mysql"
export PATH="$PATH:$MYSQL_HOME/bin"
source /etc/profile
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
chkconfig --add mysql
systemclt start mysql
#使用初始密码登录
mysql -uroot -p
#修改密码
set password=password("123456");
主从同步逻辑:从数据库会读取主数据库binlog里的二进制数据,存的就是主的操作sql,所以要开启binlog日志。
vim /etc/my.cnf
[mysqld]
server-id=22 #主的唯一编码,不能和从一样
log-bin=mysql-bin #开启binlog日志,必须要开启才能同步数据
expire_logs_days=7 #删除超过7天的binlog日志
binlog-do-db=test #需要同步的数据库
#不同步的数据库
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
#解决group by报错问题
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
lower_case_table_names=1 #转为小写运行sql
basedir=/usr/local/mysql # 安装目录
datadir=/usr/local/mysql/data #数据&日志存放目录,binlog就在此处
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
#重启mysql
systemctl restart mysql
mysql -uroot -p
GRANT REPLICATION SLAVE ON *.* to 'replica'@'%' identified by '123456';
FLUSH PRIVILEGES;
#查看主状态,有数据则说明开启成功,file和position在从会用到
mysql> show master status;
+------------------+----------+--------------+-------------------------------------------------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+-------------------------------------------------------------+-------------------+
| mysql-bin.000001 | 100 | test | mysql,information_schema,performance_schema,sys,manufacture | |
+------------------+----------+--------------+-------------------------------------------------------------+-------------------+
#查看是否开启binlog日志,ON开启,OFF关闭,为OFF重启mysql,或查看my.cnf是否开启binlog
mysql> SHOW VARIABLES LIKE 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row in set (0.00 sec)
vim /etc/my.cnf
[mysqld]
bind-address=0.0.0.0
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
log-bin=mysql-bin
server-id=125
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
lower_case_table_names=1
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
!includedir /etc/my.cnf.d
#重启mysql
systemctl restart mysql
在从数据库运行此命令,填入在主show master status;显示的file和position值
#主服务器ip,主创建的slave账号,主状态的file和position值
change master to master_host='192.168.1.91',master_user='replica',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=100;
#开启从同步
start slave;
#查看从同步状态,最后两个都显示yes才是成功
mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.91
Master_User: replica
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 211862
Relay_Log_File: ecs-365681-0001-relay-bin.000003
Relay_Log_Pos: 42249
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes #必须yes
Slave_SQL_Running: Yes #必须yes
根据上方配置,全部配置好,就可以测试主从同步了。
出现不同步问题,或者报错问题,请看查看下方的问题解决。
首先主从服务器是能够ping通的,我默认你没有通信上的问题。
#查看异常日志,找到Last_Error
mysql> show slave status \G;
Last_Error: Could not execute Update_rows event on table test.user
解决方法:
一般是因为主和从数据不一致导致报错,比如主的表或者列数据在从找不到,如果从是一个全新的环境,而主是有数据的生产环境,这时需要把主的数据库先导入进从,导出后需要记住导出时的主状态position值。
#下方命令都是在从数据库运行
#停止从同步
stop slave;
#删除主的所有同步信息
reset slave all;
#重新配置同步,填入导出时的position,比如导出时position是200,那就是从200位置开始同步
change master to master_host='192.168.1.91',master_user='replica',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=200;
start slave;
如果根据第一点还是报错,–start-position=124310 可以查看主的binlog日志对应的这条报错sql是什么。
如果你只对某个特定时间范围内的SQL语句感兴趣,可以使用–stop-datetime和–start-datetime选项来限制输出的时间范围。
#切换到从
#查看报错binlog的位置
mysql> show slave status \G;
Read_Master_Log_Pos: 124310
#切换到主
#查看postion位置的报错sql
cd /usr/local/mysql/bin
./mysqlbinlog --base64-output=DECODE-ROWS --verbose --start-position=124310 ../data/mysql-bin.000001 |head -n 100
解决方法:
知道了报错sql,那就根据报错sql来修复数据,比如更新操作,发现从没有这条数据,那就插入这条数据。
如果表数据太多了,可以用navicat对两个数据库某个表进行数据同步,此时同步的数据是最新的,所以要重新绑定主的最新position位置,重新绑定命令就是第一个问题的解决方案。
根据position跳过某次报错
#查看报错binlog的位置
mysql> show slave status \G;
找到打印:Read_Master_Log_Pos: 124310
STOP SLAVE;
#报错的position的位置
SET GLOBAL sql_slave_skip_counter = 124310;
START SLAVE;
show slave status\G