准备工作
- Ubuntu 20.04 LTS 服务器两台, 使用 apt update && apt upgrade 安装最新的补丁
- 修改两台服务器的名字分别为 mysql-1, mysql-2
安装MySQL/Mariadb
# 在 mysql-1, mysql-2 执行
apt install mariadb-server -y
# 用 apt install mysql-server -y 安装MySQL
配置主库服务器
# 在 mysql-1 上执行
mysql # 进入mysql交互窗口
# 创建用户 db_user, db_user_repl
USE mysql;
CREATE USER db_user IDENTIFIED BY 'db_user@123';
CREATE USER db_user_repl IDENTIFIED BY 'db_user@123';
# 给root用户创建密码,设置root用户可以从其它host登录
ALTER USER 'root'@'localhost' IDENTIFIED BY 'db_user@123';
UPDATE user SET host='%' WHERE user='root';
# 给 db_user, db_user_repl 用户DDL权限
GRANT ALL PRIVILEGES ON *.* TO 'db_user'@'%' IDENTIFIED BY 'db_user@123';
GRANT SELECT on performance_schema.* TO 'db_user'@'%' IDENTIFIED BY 'db_user@123';
GRANT ALL PRIVILEGES ON *.* to 'db_user_repl'@'%' IDENTIFIED BY 'db_user@123';
GRANT SELECT on performance_schema.* TO 'db_user_repl'@'%' IDENTIFIED BY 'db_user@123';
flush privileges;
# 停止mariadb服务
systemctl stop mariadb
# 编辑mysql-1配置文件
vim /etc/mysql/mariadb.conf.d/50-server.cnf
# 添加或修改如下配置,以下配置需要位于[mysqld]下
bind_address = 0.0.0.0
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
# 启动mariadb服务
systemctl start mariadb
# 进入mysql-1交互窗口
mysql -hmysql-1 -uroot -p
# 输入密码db_user@123
# 授权db_user_repl用户可以进行到 mysql-2 的复制
# 注意:这里尽量使用hostname,不推荐使用IP
GRANT REPLICATION SALVE ON *.* TO 'db_user_repl'@'mysql-2' IDENTIFIED BY 'db_user@123';
# 查看最新binlog列表,或者show master logs查看binlog列表
show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 651 | | |
+------------------+----------+--------------+------------------+
# 查看binlog日志
show binlog events in 'mysql-bin.000001';
+------------------+-----+-------------------+-----------+-------------+------------------------------------
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+-------------------+-----------+-------------+------------------------------------
| mysql-bin.000001 | 4 | Format_desc | 1 | 256 | Server ver: 10.3.30-MariaDB-
| mysql-bin.000001 | 256 | Gtid_list | 1 | 285 | []
| mysql-bin.000001 | 285 | Binlog_checkpoint | 1 | 328 | mysql-bin.000001
| mysql-bin.000001 | 328 | Gtid | 1 | 370 | GTID 0-1-1
| mysql-bin.000001 | 370 | Query | 1 | 455 | drop database hive
| mysql-bin.000001 | 455 | Gtid | 1 | 497 | GTID 0-1-2
+------------------+-----+-------------------+-----------+-------------+------------------------------------
完整同步主从数据库
# 在主数据库mysql-1上执行,完整导出主数据库
mysqldump -uroot -p -A > all-database.sql
# 输入密码 db_user@123
# 从 mysql-1 复制 all-database.sql 到 mysql-2
scp ./all-database.sql root@mysql-2:/root/
# 在从数据库mysql-2上执行,完整导入主数据库
mysql -uroot -p < all-database.sql
# 输入密码 db_user@123
配置从数据库 mysql-2
# 在从数据库 mysql-2 执行
# 停止mariadb服务
systemctl stop mariadb
# 编辑mysql-1配置文件
vim /etc/mysql/mariadb.conf.d/50-server.cnf
# 添加或修改如下配置,以下配置需要位于[mysqld]下
bind_address = 0.0.0.0
server-id = 2 # 这个地方一定要跟mysql-1不同
read_only=ON #(主到从是单向同步,从数据库设置只读,防止数据写入从服务器,主从数据不一致问题,但是mysql的root仍旧可以写入)
# 启动mariadb服务
systemctl start mariadb
# 进入mysql-2交互窗口
mysql -hmysql-2 -uroot -p
# 输入密码db_user@123
# 在mysql-2交互窗口执行,设置要同步的主服务器
CHANGE MASTER TO
MASTER_HOST='mysql-1', # MASTER_HOST尽量不设置ip,使用域名并在主机上设置dns
MASTER_USER='db_user_repl', # 用来复制的用户
MASTER_PASSWORD='db_user@123',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001', # 在主mysql-1上执行 show master status 得到的结果
MASTER_LOG_POS=62, # 在主mysql-1上执行 show master status 得到的结果
MASTER_CONNECT_RETRY=10;
# 启动从服务器
start slave;
# 查看从服务器的状态
show slave status\G
# Slave_IO_Running: Yes #负责与主机的io通信
# Slave_SQL_Running: Yes #负责自己的slave mariadb进程
检查主从复制状态
# 在主 mysql-1 的交互窗口执行,结果中需要出现 [Binlog Dump] Command
show processlist;
# 在从 mysql-2 的交互窗口执行,结果中需要出现 [Slave_IO],[Slave_SQL] Command
show processlist;
验证主从复制
# 在主 mysql-1 上执行
CREATE SCHEMA test_repl_db;
USE test_repl_db;
CREATE TABLE test1 (id int, name char);
INSERT INTO test1(id, name) VALUES (1, 'p');
# 在从 mysql-2 上执行
USE test_repl_db;
SELECT * FROM test1;
# 显示正在运行的mysql process
show processlist;
select id, db, user, host, command, time, state, info from information_schema.processlist
本文暂时没有评论,来添加一个吧(●'◡'●)