773 字
4 分钟
搭建MySQL主从服务器

买服务器#

先买两台服务器,装ubuntu系统

安装mysql#

修改配置,让两个服务器能够互相连接#

开启监听#

root@ecs-f95f-0002:/etc/mysql/mysql.conf.d# vim mysqld.cnf

修改从库

root@ecs-f95f-0001:/etc/mysql/mysql.conf.d# sudo systemctl restart mysql root@ecs-f95f-0002:/etc/mysql/mysql.conf.d# sudo systemctl restart mysql

重启一下主库和从库的mysql

为root开启远程访问#

mysql> ALTER USER ‘root’@’%’ IDENTIFIED WITH mysql_native_password BY ‘root’; Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec)

启用密码验证

现在可以连接上了

修改主库配置#

[mysqld]
server-id = 153
# 启用二进制日志功能,这是复制的基础
log-bin = /var/log/mysql/mysql-bin.log
# (可选) 设置二进制日志的格式,建议使用ROW格式,可以更好地保证数据一致性
binlog_format = ROW
binlog_ignore_db = mysql

创建远程用户#

-- 创建远程用户
CREATE USER 'repl_user'@'%' IDENTIFIED WITH mysql_native_password BY 'remote';
-- 给予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
-- 刷新权限
FLUSH PRIVILEGES;

-- 锁定所有表,防止新的数据写入,确保数据一致性
FLUSH TABLES WITH READ LOCK;
-- 查看主服务器状态
SHOW MASTER STATUS;

备份主数据库,传到从服务器#

Terminal window
mysqldump -u root -p --all-databases --source-data > ./master_backup.sql

创建密钥

Terminal window
ssh-keygen -t rsa -b 4096

密钥创建好以后,把公钥放到从服务器

Terminal window
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.93

Host mysql-slave
HostName 192.168.0.93
User root
Port 22
IdentityFile ~/.ssh/id_rsa

从服务器配置:

Terminal window
ssh-keygen -t rsa -b 4096
Terminal window
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.153

Host mysql-master
HostName 192.168.0.153
User root
Port 22
IdentityFile ~/.ssh/id_rsa

从主服务器上把备份好的数据库传到从库上

root@ecs-f95f-0002:~# scp master_backup.sql mysql-slave:~
master_backup.sql

从库已经可以看到了

导入

主库解锁

从库mysql配置文件

[mysqld]
server-id = 93
relay-log = /var/log/mysql/mysql-relay-bin
read-only = 1
# (可选但推荐) 记录从服务器的数据更改到自己的二进制日志,以便将来可以作为其他从服务器的主服务器
log-bin = /var/log/mysql/mysql-bin.log

重启从库并且登录从库

stop slave;
CHANGE MASTER TO
MASTER_HOST = '192.168.0.153',
MASTER_USER = 'repl_user',
MASTER_PASSWORD = 'remote',
MASTER_LOG_FILE = 'mysql-bin.000005',
MASTER_LOG_POS = 157;
START SLAVE;

mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for source to send event
Master_Host: 192.168.0.153
Master_User: repl_user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000005
Read_Master_Log_Pos: 1826
Relay_Log_File: mysql-relay-bin.000002
Relay_Log_Pos: 326
Relay_Master_Log_File: mysql-bin.000005
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 1826
Relay_Log_Space: 536
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 153
Master_UUID: 014654cd-8d83-11f0-b940-fa163e8fe780
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
Master_public_key_path:
Get_master_public_key: 0
Network_Namespace:
1 row in set, 1 warning (0.00 sec)
ERROR:
No query specified

在主库里面 创建库,表,插入数据

-- 创建 UTF8MB4 数据库
CREATE DATABASE testdb
CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;
use testdb;
CREATE TABLE user_data (
id INT AUTO_INCREMENT PRIMARY KEY, -- 主键,自动递增
username VARCHAR(255) NOT NULL, -- 用户名,最大长度255
comment TEXT CHARACTER SET utf8mb4 -- 评论,支持存储表情符号和其他Unicode字符
) ENGINE=InnoDB CHARSET=utf8mb4;
-- 插入常规数据
INSERT INTO user_data (username, comment) VALUES ('Alice', 'Hello, world!');
-- 插入带表情符号的数据
INSERT INTO user_data (username, comment) VALUES ('Bob', 'This is fun! 😊');
-- 插入中文字符
INSERT INTO user_data (username, comment) VALUES ('Charlie', '你好,世界!');
-- 插入混合内容
INSERT INTO user_data (username, comment) VALUES ('David', '中文+Emoji 🌟😄');

接下来我们看看从库状态