一台Linux主机上两个mysql实例之间实现主从复制(v2.0)

打印 上一主题 下一主题

主题 1862|帖子 1862|积分 5586

mysql主从复制 应该不会报错版
v2.0 更新于2025.3.27
题目




2.

是一个AppArmor的东西制止了对数据库的配置和初始化的操作,所以接下来要把它禁用。
解决:

步骤 1: 制止 AppArmor 服务

  1. sudo systemctl stop apparmor
复制代码
步骤 2: 修改内核启动参数

通过修改 GRUB 配置文件来克制加载 AppArmor。打开 GRUB 配置文件:
  1. sudo gedit /etc/default/grub
复制代码
ctrl+f 搜刮
GRUB_CMDLINE_LINUX_DEFAULT
找到这一行:
GRUB_CMDLINE_LINUX_DEFAULT=“quiet splash”
并在引号内添加 apparmor=0
  1. GRUB_CMDLINE_LINUX_DEFAULT="quiet splash apparmor=0"
复制代码
然后更新 GRUB 配置:
  1. sudo update-grub
复制代码
步骤 3: 重启体系

完成上述步骤后,重新启动体系:
  1. sudo reboot
复制代码
重启后,AppArmor 就应该被彻底禁用了,应该就不会报错了。
保险起见,卸载Mysql,删除之前留下的相关文件

1.关闭全部 MySQL进程

  1. sudo systemctl stop mysql
  2. sudo pkill mysqld
复制代码
2.卸载Mysql相关

  1. sudo apt purge mysql-*
  2. sudo rm -rf /etc/mysql/ /var/lib/mysql
  3. sudo apt autoremove
  4. sudo apt autoclean
复制代码
3.手动删除文件夹

删除时如果提示:
dpkg:告诫:卸载 mysql-common 时,目录/etc/mysql 非空,因而不会删除该目录

直接删掉:
  1. sudo rm -r /etc/mysql/
复制代码
=w=
然后从序章开始,应该就不会报错了。
=w=
序章:下载mysql

  1. sudo apt-get update
  2. sudo apt-get install mysql-server
复制代码
1. 制止全部 MySQL 实例

首先,确保全部正在运行的 MySQL 实例都已制止,以制止端口冲突或其他题目。
bash
  1. sudo systemctl stop mysql
  2. sudo pkill mysqld
复制代码
2. 查抄并清算现有的 MySQL 数据目录

确保数据目录干净,制止旧的数据文件干扰新的实例配置。
bash
  1. sudo rm -rf /var/lib/mysql3306/*
  2. sudo rm -rf /var/lib/mysql3307/*
复制代码
注意:此操作将删除现有数据,请确保你不必要这些数据或已经备份。
3. 配置主服务器(端口 3306)​

3.1 创建主服务器的配置文件

创建一个独立的配置文件 /etc/mysql/my3306.cnf:
bash
  1. sudo nano /etc/mysql/my3306.cnf
复制代码
内容如下:​
ini
  1. [mysqld]
  2. # 基本配置
  3. port=3306
  4. socket=/var/run/mysqld/mysqld3306.sock
  5. # 唯一标识
  6. server-id=1
  7. # 启用二进制日志
  8. log-bin=/var/log/mysql/mysql-bin3306.log
  9. # 数据目录
  10. datadir=/var/lib/mysql3306
  11. # 错误日志
  12. log_error=/var/log/mysql/error3306.log
  13. # 设置 PID 文件
  14. pid-file=/var/run/mysqld/mysqld3306.pid
复制代码
3.2 创建必要的目录并设置权限

bash
  1. sudo mkdir -p /var/lib/mysql3306
  2. sudo mkdir -p /var/log/mysql
  3. sudo chown -R mysql:mysql /var/lib/mysql3306
  4. sudo chown -R mysql:mysql /var/log/mysql
复制代码
3.3 初始化主服务器的数据目录

bash
  1. sudo mysqld --defaults-file=/etc/mysql/my3306.cnf --initialize-insecure --user=mysql
复制代码
注意:--initialize-insecure 会初始化数据目录但不设置 root 暗码。如果你希望设置暗码,可以利用 --initialize 并查看暂时暗码。
3.4 启动主服务器

bash
  1. sudo mysqld_safe --defaults-file=/etc/mysql/my3306.cnf &
复制代码
============================================================
大概!!!!!!!!!(没题目直接去3.5)
利用 Systemd 管理(保举):​
创建 Systemd 服务文件 /etc/systemd/system/mysql3306.service:
ini
  1. [Unit]
  2. Description=MySQL Server 3306
  3. After=network.target
  4. [Service]
  5. User=mysql
  6. Group=mysql
  7. ExecStart=/usr/sbin/mysqld --defaults-file=/etc/mysql/my3306.cnf
  8. ExecStop=/usr/bin/mysqladmin -uroot -proot --socket=/var/run/mysqld/mysqld3306.sock shutdown
  9. Restart=on-failure
  10. [Install]
  11. WantedBy=multi-user.target
复制代码
然后启动并启用服务:
bash
  1. sudo systemctl daemon-reload
  2. sudo systemctl start mysql3306
  3. sudo systemctl enable mysql3306
复制代码
3.5 连接到主服务器并设置 root 暗码

如果利用 --initialize-insecure,必要手动设置 root 暗码:
bash
  1. sudo mysql -uroot --socket=/var/run/mysqld/mysqld3306.sock
复制代码
在 MySQL 提示符下:
sql
  1. ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
  2. FLUSH PRIVILEGES;
  3. EXIT;
复制代码
注意:将 'new_secure_password' 更换为你现实的强暗码。
3.6 创建复制用户并授予权限

bash
  1. sudo mysql -uroot -proot --socket=/var/run/mysqld/mysqld3306.sock
复制代码
在 MySQL 提示符下:
sql
  1. CREATE USER 'repl'@'localhost' IDENTIFIED BY 'root';
  2. GRANT REPLICATION SLAVE ON *.* TO 'repl'@'localhost';
  3. FLUSH PRIVILEGES;
  4. EXIT;
复制代码
3.7 获取主服务器的二进制日志信息

bash
  1. sudo mysql -uroot -proot --socket=/var/run/mysqld/mysqld3306.sock
  2. -e "SHOW MASTER STATUS\G;"
复制代码
纪录下 File 和 Position 的值,例如:
plaintext
  1. +------------------+----------+--------------+------------------+-------------------+
  2. | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  3. +------------------+----------+--------------+------------------+-------------------+
  4. | mysql-bin3306.000001 |      154 |              |                  |                   |
  5. +------------------+----------+--------------+------------------+-------------------+
复制代码
记下 File(如 mysql-bin3306.000001)和 Position(如 154),稍后在从服务器上利用。
4. 配置从服务器(端口 3307)​

4.1 创建从服务器的配置文件

创建一个独立的配置文件 /etc/mysql/my3307.cnf:
bash
  1. sudo nano /etc/mysql/my3307.cnf
复制代码
内容如下:​
ini
  1. [mysqld]
  2. # 基本配置
  3. port=3307
  4. socket=/var/run/mysqld/mysqld3307.sock
  5. # 唯一标识
  6. server-id=2
  7. # 禁用二进制日志(从库不需要)
  8. # 如果需要记录从库的二进制日志,可以取消注释并配置
  9. # log-bin=/var/log/mysql/mysql-bin3307.log
  10. # 数据目录
  11. datadir=/var/lib/mysql3307
  12. # 错误日志
  13. log_error=/var/log/mysql/error3307.log
  14. # 设置 PID 文件
  15. pid-file=/var/run/mysqld/mysqld3307.pid
复制代码
4.2 创建必要的目录并设置权限

bash
  1. sudo mkdir -p /var/lib/mysql3307
  2. sudo chown -R mysql:mysql /var/lib/mysql3307
复制代码
4.3 初始化从服务器的数据目录

bash
  1. sudo mysqld --defaults-file=/etc/mysql/my3307.cnf --initialize-insecure --user=mysql
复制代码
4.4 启动从服务器

bash
  1. sudo mysqld_safe --defaults-file=/etc/mysql/my3307.cnf &
复制代码
=============================================================
大概!!!!!!!!!!(没题目直接去4.5)
利用 Systemd 管理(保举):​

创建 Systemd 服务文件 /etc/systemd/system/mysql3307.service:
ini
  1. [Unit]
  2. Description=MySQL Server 3307
  3. After=network.target
  4. [Service]
  5. User=mysql
  6. Group=mysql
  7. ExecStart=/usr/sbin/mysqld --defaults-file=/etc/mysql/my3307.cnf
  8. ExecStop=/usr/bin/mysqladmin -uroot -proot --socket=/var/run/mysqld/mysqld3307.sock shutdown
  9. Restart=on-failure
  10. [Install]
  11. WantedBy=multi-user.target
复制代码
然后启动并启用服务:
bash
  1. sudo systemctl daemon-reload
  2. sudo systemctl start mysql3307
  3. sudo systemctl enable mysql3307
复制代码
4.5 连接到从服务器并设置 root 暗码

如果利用 --initialize-insecure,必要手动设置 root 暗码:
bash
  1. sudo mysql -uroot --socket=/var/run/mysqld/mysqld3307.sock
复制代码
在 MySQL 提示符下:
sql
  1. ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
  2. FLUSH PRIVILEGES;
  3. EXIT;
复制代码
注意: 'root' 为你现实的暗码。
5. 配置从服务器连接到主服务器

5.1 登录到从服务器

bash
  1. sudo mysql -uroot -proot --socket=/var/run/mysqld/mysqld3307.sock
复制代码
5.2 制止从库复制进程(如果已启动)​

sql
  1. STOP SLAVE;
复制代码
5.3 配置主库连接信息

sql
  1. CHANGE MASTER TO
  2.     MASTER_HOST='127.0.0.1',
  3.     MASTER_USER='repl',
  4.     MASTER_PASSWORD='root',
  5.     MASTER_LOG_FILE='mysql-bin3306.000002', -- 替换为主库的 File 值
  6.     MASTER_LOG_POS=1159;                    -- 替换为主库的 Position 值
复制代码
注意


  • 确保 MASTER_LOG_FILE 和 MASTER_LOG_POS 利用的是主库上 SHOW MASTER STATUS 获取的值。
  • 如果主库和从库的 root 暗码差异,确保 MASTER_PASSWORD 设置正确。
5.4 启动从库复制进程

sql
  1. START SLAVE;
复制代码
5.5 查抄从库复制状态

sql
  1. SHOW SLAVE STATUS\G;
复制代码
在输出中,查找以下两项是否为 Yes:
plaintext
  1. Slave_IO_Running: Yes
  2. Slave_SQL_Running: Yes
复制代码
示例输出:​
plaintext
  1. *************************** 1. row ​***************************
  2.                Slave_IO_State: Waiting for master to send event
  3.                   Master_Host: 127.0.0.1
  4.                   Master_User: repl
  5.                   Master_Port: 3306
  6.                 Connect_Retry: 60
  7.               Master_Log_File: mysql-bin3306.000001
  8.           Read_Master_Log_Pos: 154
  9.                Relay_Log_File: mysql-relay-bin3307.000001
  10.                 Relay_Log_Pos: 4
  11.         Relay_Master_Log_File: mysql-bin3306.000001
  12.              Slave_IO_Running: Yes
  13.             Slave_SQL_Running: Yes
  14.               Replicate_Do_DB:
  15.           Replicate_Ignore_DB:
  16.            Replicate_Do_Table:
  17.        Replicate_Ignore_Table:
  18.       Replicate_Wild_Do_Table:
  19.   Replicate_Wild_Ignore_Table:
  20.                    Last_Errno: 0
  21.                    Last_Error:
  22.                  Skip_Counter: 0
  23.           Exec_Master_Log_Pos: 154
  24.               Relay_Log_Space: 107
  25.               Until_Condition: None
  26.                Until_Log_File:
  27.                 Until_Log_Pos: 0
  28.            Master_SSL_Allowed: No
  29.            Master_SSL_CA_File:
  30.            Master_SSL_CA_Path:
  31.               Master_SSL_Cert:
  32.             Master_SSL_Cipher:
  33.                Master_SSL_Key:
  34.         Seconds_Behind_Master: 0
  35. Master_SSL_Verify_Server_Cert: No
  36.                 Last_IO_Errno: 0
  37.                 Last_IO_Error:
  38.                Last_SQL_Errno: 0
  39.                Last_SQL_Error:
  40.   Replicate_Ignore_Server_Ids:
  41.              Master_Server_Id: 1
  42.                   Master_UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
  43.              Master_Info_File: /var/lib/mysql3307/master.info
  44.                     SQL_Delay: 0
  45.           SQL_Remaining_Delay: NULL
  46.       Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
  47.            Master_Retry_Count: 86400
  48.                   Master_Bind:
  49.       Last_IO_Error_Timestamp:
  50.      Last_SQL_Error_Timestamp:
  51.                Master_SSL_Crl:
  52.            Master_SSL_Crlpath:
  53.            Retrieved_Gtid_Set:
  54.             Executed_Gtid_Set:
  55.                 Auto_Position: 0
  56. 1 rows in set (0.00 sec)
复制代码
如果 Slave_IO_Running 和 Slave_SQL_Running 都为 Yes,则主从复制已成功配置。
查抄:

1.打开主库,创建表
  1. sudo mysql -uroot -proot --socket=/var/run/mysqld/mysqld3306.sock
复制代码
  1. CREATE DATABASE test_db;
  2. USE test_db;
  3. CREATE TABLE test_table (id INT, name VARCHAR(20));
  4. INSERT INTO test_table VALUES (1, 'test');
复制代码
2.打开从库,查抄数据同步环境
  1. sudo mysql -uroot -proot --socket=/var/run/mysqld/mysqld3307.sock
复制代码
  1. SHOW DATABASES;
  2. USE test_db;
  3. SHOW TABLES;
  4. SELECT * FROM test_table;
复制代码
如果输出的数据和在主库创建的数据同等,就成功了。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莱莱

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表