一、主库搭建:
编辑mysql配置文件
vim /etc/my.cnf
[mysqld]
server-id=1 #数据库唯一ID,主从的标识号绝对不能重复
log-bin=mysql-bin #开启log-bin,并指定文件目录和文件名前缀
binlog-do-db=edu #需要同步的数据库,可以多写几行来配置多个库同步
binlog_ignore_db=mysql #不需要同步的数据库,可以多行或者逗号分隔
lower_case_table_names=1 #说明 0:区分大小写,1:不区分大小写
sync_binlog=1 #确保binlog日志写入后于硬盘同步
重启 mysql 服务
centos 7 : systemctl restart mysql
centos 8 : service mysql restart
rocky 9.0: /usr/local/mysql/support-files/mysql.server restart
创建MySQL同步用户
mysql -uroot -p'123456'
### 只有同步的权限
grant replication slave on *.* to db_slave@'%' identified by '123456';
flush privileges;
或者使用以下方法创建也可以
create user 'db_slave'@'%' identified by '123456';
GRANT REPLICATION SLAVE on *.* to 'db_slave'@'%';
select user,host from mysql.user;
flush privileges;
在 mysql 8.0以后的版本中 建用户需要使用以下命令
需要修改一下mysql_native_password 或者使用 caching_sha2_password
因为在mysql 8.0 以后的版本中 sha256_password 已经被弃用
grant all privileges on *.* to db_slave@'%' identified by '123456' with grant option;
create user db_slave@'%' identified by '123456';
flush privileges;
alter user db_slave@'%' identified with mysql_native_password by '123456';
查看权限:
show grants for 'db_slave'@'%';
flush privileges;
查看master状态
show master status;
如果是在以有数据的数据库中做主从
首先登陆数据库,然后刷新所有的表,同时给数据库加上一把锁,阻止对数据库进行任何的写操作
mysql -uroot -p'123456'
mysql > flush tables with read lock;
mysql > exit;
在命令行开始导出数据:
mysqldump -uroot -p'123456' -S /var/lib/mysql/mysql.sock --all-databases > mysql.bak.sql
如果数据量很大,可以在导出时就压缩为原来的大概三分之一
mysqldump -uroot -p'123456' -S /var/lib/mysql/mysql.sock --all-databases | gzip > mysql.bak.sql.gz
二、 从库开始操作
vi /etc/my.cnf
server-id=2
relay-log=slave-relay-bin
relay-log-index=slave-relay-bin.index
## 忽略表
replicate-wild-ignore-table=mysql.*
replicate-wild-ignore-table=sys.*
重启服务器
centos 7 : systemctl restart mysql
centos 8 : service mysql restart
rocky 9.0: /usr/local/mysql/support-files/mysql.server restart
如果主服务器导出了数据,下面就导入该文件,如果主服务器没有数据,就忽略这一步
mysql -uroot -p'123456'
mysql > source /root/mysql.bak.sql
如果从主服务器上拿过来的是压缩文件,就先解压再导入
关联master用户,master_log_file和master_log_pos必须跟master提供的一致
mysql> CHANGE MASTER TO
MASTER_HOST='主库IP地址',
MASTER_USER='db_slave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
启动slave
start slave;
查看salve状态
show slave status \G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
这时可以回到主库服务器上对主数据库解锁,恢复对主数据库的操作
mysql -uroot -p'123456'
mysql > unlock tables;
测试:
在主库上建一个数据库
mysql -uroot -p123456
mysql > create database test;
登陆从库:
mysql -uroot -p123456
mysql > show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| tagman |
| test |
+--------------------+
6 rows in set (0.01 sec)
大功告成;