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 = ROWbinlog_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;
备份主数据库,传到从服务器
mysqldump -u root -p --all-databases --source-data > ./master_backup.sql
创建密钥
ssh-keygen -t rsa -b 4096
密钥创建好以后,把公钥放到从服务器
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
从服务器配置:
ssh-keygen -t rsa -b 4096
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 = 93relay-log = /var/log/mysql/mysql-relay-binread-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: 0Master_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 testdbCHARACTER SET utf8mb4COLLATE 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 🌟😄');
接下来我们看看从库状态