mysql主从复制 应该不会报错版
v2.0 更新于2025.3.27
题目
2.
是一个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 配置:
步骤 3: 重启体系
完成上述步骤后,重新启动体系:
重启后,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 非空,因而不会删除该目录
直接删掉:
=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
- [mysqld]
- # 基本配置
- 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
- [Unit]
- Description=MySQL Server 3306
- After=network.target
- [Service]
- 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
- [Install]
- 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
- [mysqld]
- # 基本配置
- 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
- [Unit]
- Description=MySQL Server 3307
- After=network.target
- [Service]
- 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
- [Install]
- 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
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
5.5 查抄从库复制状态
sql
在输出中,查找以下两项是否为 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企服之家,中国第一个企服评测及商务社交产业平台。 |