一台Linux主机上两个mysql实例之间实现主从复制(v2.0)
mysql主从复制 应该不会报错版v2.0 更新于2025.3.27
题目
[*]
https://i-blog.csdnimg.cn/direct/8e674a44797e44649c95e088475c0bbe.png#pic_center
2.
https://i-blog.csdnimg.cn/direct/9c0106b9403745efbc798d3a0d4ab5b7.png#pic_center
是一个AppArmor的东西制止了对数据库的配置和初始化的操作,所以接下来要把它禁用。
解决:
步骤 1: 制止 AppArmor 服务
sudo systemctl stop apparmor
步骤 2: 修改内核启动参数
通过修改 GRUB 配置文件来克制加载 AppArmor。打开 GRUB 配置文件:
sudo gedit /etc/default/grub
ctrl+f 搜刮
GRUB_CMDLINE_LINUX_DEFAULT
找到这一行:
GRUB_CMDLINE_LINUX_DEFAULT=“quiet splash”
并在引号内添加 apparmor=0:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash apparmor=0"
然后更新 GRUB 配置:
sudo update-grub
步骤 3: 重启体系
完成上述步骤后,重新启动体系:
sudo reboot
重启后,AppArmor 就应该被彻底禁用了,应该就不会报错了。
保险起见,卸载Mysql,删除之前留下的相关文件
1.关闭全部 MySQL进程
sudo systemctl stop mysql
sudo pkill mysqld
2.卸载Mysql相关
sudo apt purge mysql-*
sudo rm -rf /etc/mysql/ /var/lib/mysql
sudo apt autoremove
sudo apt autoclean
3.手动删除文件夹
删除时如果提示:
dpkg:告诫:卸载 mysql-common 时,目录/etc/mysql 非空,因而不会删除该目录
https://i-blog.csdnimg.cn/direct/a94a7121647a4880b3e873bb13f23421.png#pic_center
直接删掉:
sudo rm -r /etc/mysql/
=w=
然后从序章开始,应该就不会报错了。
=w=
序章:下载mysql
sudo apt-get update
sudo apt-get install mysql-server
1. 制止全部 MySQL 实例
首先,确保全部正在运行的 MySQL 实例都已制止,以制止端口冲突或其他题目。
bash
sudo systemctl stop mysql
sudo pkill mysqld
2. 查抄并清算现有的 MySQL 数据目录
确保数据目录干净,制止旧的数据文件干扰新的实例配置。
bash
sudo rm -rf /var/lib/mysql3306/*
sudo rm -rf /var/lib/mysql3307/*
注意:此操作将删除现有数据,请确保你不必要这些数据或已经备份。
3. 配置主服务器(端口 3306)
3.1 创建主服务器的配置文件
创建一个独立的配置文件 /etc/mysql/my3306.cnf:
bash
sudo nano /etc/mysql/my3306.cnf
内容如下:
ini
# 基本配置
port=3306
socket=/var/run/mysqld/mysqld3306.sock
# 唯一标识
server-id=1
# 启用二进制日志
log-bin=/var/log/mysql/mysql-bin3306.log
# 数据目录
datadir=/var/lib/mysql3306
# 错误日志
log_error=/var/log/mysql/error3306.log
# 设置 PID 文件
pid-file=/var/run/mysqld/mysqld3306.pid
3.2 创建必要的目录并设置权限
bash
sudo mkdir -p /var/lib/mysql3306
sudo mkdir -p /var/log/mysql
sudo chown -R mysql:mysql /var/lib/mysql3306
sudo chown -R mysql:mysql /var/log/mysql
3.3 初始化主服务器的数据目录
bash
sudo mysqld --defaults-file=/etc/mysql/my3306.cnf --initialize-insecure --user=mysql
注意:--initialize-insecure 会初始化数据目录但不设置 root 暗码。如果你希望设置暗码,可以利用 --initialize 并查看暂时暗码。
3.4 启动主服务器
bash
sudo mysqld_safe --defaults-file=/etc/mysql/my3306.cnf &
============================================================
大概!!!!!!!!!(没题目直接去3.5)
利用 Systemd 管理(保举):
创建 Systemd 服务文件 /etc/systemd/system/mysql3306.service:
ini
Description=MySQL Server 3306
After=network.target
User=mysql
Group=mysql
ExecStart=/usr/sbin/mysqld --defaults-file=/etc/mysql/my3306.cnf
ExecStop=/usr/bin/mysqladmin -uroot -proot --socket=/var/run/mysqld/mysqld3306.sock shutdown
Restart=on-failure
WantedBy=multi-user.target
然后启动并启用服务:
bash
sudo systemctl daemon-reload
sudo systemctl start mysql3306
sudo systemctl enable mysql3306
3.5 连接到主服务器并设置 root 暗码
如果利用 --initialize-insecure,必要手动设置 root 暗码:
bash
sudo mysql -uroot --socket=/var/run/mysqld/mysqld3306.sock
在 MySQL 提示符下:
sql
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
FLUSH PRIVILEGES;
EXIT;
注意:将 'new_secure_password' 更换为你现实的强暗码。
3.6 创建复制用户并授予权限
bash
sudo mysql -uroot -proot --socket=/var/run/mysqld/mysqld3306.sock
在 MySQL 提示符下:
sql
CREATE USER 'repl'@'localhost' IDENTIFIED BY 'root';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'localhost';
FLUSH PRIVILEGES;
EXIT;
3.7 获取主服务器的二进制日志信息
bash
sudo mysql -uroot -proot --socket=/var/run/mysqld/mysqld3306.sock
-e "SHOW MASTER STATUS\G;" 纪录下 File 和 Position 的值,例如:
plaintext
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin3306.000001 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
记下 File(如 mysql-bin3306.000001)和 Position(如 154),稍后在从服务器上利用。
4. 配置从服务器(端口 3307)
4.1 创建从服务器的配置文件
创建一个独立的配置文件 /etc/mysql/my3307.cnf:
bash
sudo nano /etc/mysql/my3307.cnf
内容如下:
ini
# 基本配置
port=3307
socket=/var/run/mysqld/mysqld3307.sock
# 唯一标识
server-id=2
# 禁用二进制日志(从库不需要)
# 如果需要记录从库的二进制日志,可以取消注释并配置
# log-bin=/var/log/mysql/mysql-bin3307.log
# 数据目录
datadir=/var/lib/mysql3307
# 错误日志
log_error=/var/log/mysql/error3307.log
# 设置 PID 文件
pid-file=/var/run/mysqld/mysqld3307.pid
4.2 创建必要的目录并设置权限
bash
sudo mkdir -p /var/lib/mysql3307
sudo chown -R mysql:mysql /var/lib/mysql3307
4.3 初始化从服务器的数据目录
bash
sudo mysqld --defaults-file=/etc/mysql/my3307.cnf --initialize-insecure --user=mysql
4.4 启动从服务器
bash
sudo mysqld_safe --defaults-file=/etc/mysql/my3307.cnf &
=============================================================
大概!!!!!!!!!!(没题目直接去4.5)
利用 Systemd 管理(保举):
创建 Systemd 服务文件 /etc/systemd/system/mysql3307.service:
ini
Description=MySQL Server 3307
After=network.target
User=mysql
Group=mysql
ExecStart=/usr/sbin/mysqld --defaults-file=/etc/mysql/my3307.cnf
ExecStop=/usr/bin/mysqladmin -uroot -proot --socket=/var/run/mysqld/mysqld3307.sock shutdown
Restart=on-failure
WantedBy=multi-user.target
然后启动并启用服务:
bash
sudo systemctl daemon-reload
sudo systemctl start mysql3307
sudo systemctl enable mysql3307
4.5 连接到从服务器并设置 root 暗码
如果利用 --initialize-insecure,必要手动设置 root 暗码:
bash
sudo mysql -uroot --socket=/var/run/mysqld/mysqld3307.sock
在 MySQL 提示符下:
sql
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
FLUSH PRIVILEGES;
EXIT;
注意: 'root' 为你现实的暗码。
5. 配置从服务器连接到主服务器
5.1 登录到从服务器
bash
sudo mysql -uroot -proot --socket=/var/run/mysqld/mysqld3307.sock
5.2 制止从库复制进程(如果已启动)
sql
STOP SLAVE;
5.3 配置主库连接信息
sql
CHANGE MASTER TO
MASTER_HOST='127.0.0.1',
MASTER_USER='repl',
MASTER_PASSWORD='root',
MASTER_LOG_FILE='mysql-bin3306.000002', -- 替换为主库的 File 值
MASTER_LOG_POS=1159; -- 替换为主库的 Position 值
注意:
[*]确保 MASTER_LOG_FILE 和 MASTER_LOG_POS 利用的是主库上 SHOW MASTER STATUS 获取的值。
[*]如果主库和从库的 root 暗码差异,确保 MASTER_PASSWORD 设置正确。
5.4 启动从库复制进程
sql
START SLAVE;
5.5 查抄从库复制状态
sql
SHOW SLAVE STATUS\G;
在输出中,查找以下两项是否为 Yes:
plaintext
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
示例输出:
plaintext
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 127.0.0.1
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin3306.000001
Read_Master_Log_Pos: 154
Relay_Log_File: mysql-relay-bin3307.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql-bin3306.000001
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: 154
Relay_Log_Space: 107
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: 1
Master_UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Master_Info_File: /var/lib/mysql3307/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave 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
1 rows in set (0.00 sec)
如果 Slave_IO_Running 和 Slave_SQL_Running 都为 Yes,则主从复制已成功配置。
查抄:
1.打开主库,创建表
sudo mysql -uroot -proot --socket=/var/run/mysqld/mysqld3306.sock
CREATE DATABASE test_db;
USE test_db;
CREATE TABLE test_table (id INT, name VARCHAR(20));
INSERT INTO test_table VALUES (1, 'test');
2.打开从库,查抄数据同步环境
sudo mysql -uroot -proot --socket=/var/run/mysqld/mysqld3307.sock
SHOW DATABASES;
USE test_db;
SHOW TABLES;
SELECT * FROM test_table;
如果输出的数据和在主库创建的数据同等,就成功了。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]