加入收藏 | 设为首页 | 会员中心 | 我要投稿 聊城站长网 (https://www.0635zz.com/)- 智能语音交互、行业智能、AI应用、云计算、5G!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

mysql:master--salve 主从库同步备份 "锁表" 设置

发布时间:2023-09-19 15:55:18 所属栏目:MySql教程 来源:
导读:在 MySQL 数据库中,在进行数据迁移和从库只读状态设置时,都会涉及到只读状态和 Master-slave 的设置和关系。

经过实际测试,对于 MySQL 单实例数据库和 master 库,如果需要设置为只读状态,需要进行如下操作和
在 MySQL 数据库中,在进行数据迁移和从库只读状态设置时,都会涉及到只读状态和 Master-slave 的设置和关系。
 
经过实际测试,对于 MySQL 单实例数据库和 master 库,如果需要设置为只读状态,需要进行如下操作和设置:
 
将 MySQL 设置为只读状态的命令:
 
# mysql -uroot -p
 
mysql> show global variables like "%read_only%";
 
mysql> flush tables with read lock;
 
mysql> set global read_only=1;
 
mysql> show global variables like "%read_only%";
 
将 MySQL 从只读设置为读写状态的命令:
 
mysql> unlock tables;
 
mysql> set global read_only=0;
 
对于需要保证 master-slave 主从同步的 salve 库,如果要设置为只读状态,需要执行的命令为:
 
mysql> set global read_only=1;
 
将 salve 库从只读状态变为读写状态,需要执行的命令是:
 
mysql> set global read_only=0;
 
对于数据库读写状态,主要靠 “read_only” 全局参数来设定;默认情况下,数据库是用于读写操作的,所以 read_only 参数也是 0 或 faluse 状态,这时候不论是本地用户还是远程访问数据库的用户,都可以进行读写操作;如需设置为只读状态,将该 read_only 参数设置为 1 或 TRUE 状态,但设置 read_only=1 状态有两个需要注意的地方:
 
      1.read_only=1 只读模式,不会影响 slave 同步复制的功能,所以在 MySQL slave 库中设定了 read_only=1 后,通过 show slave status\G 命令查看 salve 状态,可以看到 salve 仍然会读取 master 上的日志,并且在 slave 库中应用日志,保证主从数据库同步一致;
 
      2.read_only=1 只读模式,可以限定普通用户进行数据修改的操作,但不会限定具有 super 权限的用户的数据修改操作;在 MySQL 中设置 read_only=1 后,普通的应用用户进行 insert、update、delete 等会产生数据变化的 DML 操作时,都会报出数据库处于只读模式不能发生数据变化的错误,但具有 super 权限的用户,例如在本地或远程通过 root 用户登录到数据库,还是可以进行数据变化的 DML 操作;
 
为了确保所有用户,包括具有 super 权限的用户也不能进行读写操作,就需要执行给所有的表加读锁的命令 “flush tables with read lock;”,这样使用具有 super 权限的用户登录数据库,想要发生数据变化的操作时,也会提示表被锁定不能修改的报错。
 
这样通过 设置 “read_only=1” 和 “flush tables with read lock;” 两条命令,就可以确保数据库处于只读模式,不会发生任何数据改变,在 MySQL 进行数据库迁移时,限定 master 主库不能有任何数据变化,就可以通过这种方式来设定。
 
但同时由于加表锁的命令对数据库表限定非常严格,如果再 slave 从库上执行这个命令后,slave 库可以从 master 读取 binlog 日志,但不能够应用日志,slave 库不能发生数据改变,当然也不能够实现主从同步了,这时如果使用 “unlock tables;” 解除全局的表读锁,slave 就会应用从 master 读取到的 binlog 日志,继续保证主从库数据库一致同步。

为了保证主从同步可以一直进行,在 slave 库上要保证具有 super 权限的 root 等用户只能在本地登录,不会发生数据变化,其他远程连接的应用用户只按需分配为 select,insert,update,delete 等权限,保证没有 super 权限,则只需要将 salve 设定 “read_only=1” 模式,即可保证主从同步,又可以实现从库只读。

相对的,设定 “read_only=1” 只读模式开启的解锁命令为设定 “read_only=0”; 设定全局锁 “flush tables with read lock;”,对应的解锁模式命令为:“unlock tables;”.
 
当然设定了 read_only=1 后,所有的 select 查询操作都是可以正常进行的。

以上为锁表操作,具体主从复制过程如下:
 
1,准备工作
 
主数据库:192.168.34.119   /linux
 
从数据库:192.168.34.129  /linux
 
2,(主库) 修改 mysql 配置文件
 
 找到主数据库的配置文件 my.cnf (或者 my.ini),我的在 /etc/my.cnf, 在 [mysqld] 部分插入如下两行:
 
[mysqld]
 
log-bin=mysql-bin #开启二进制日志
 
server-id=1 #设置server-id
 
2.(主库) 重启 mysql,创建用于同步的用户账号
 
打开 mysql 会话
 
mysql>mysql  -uroot -p
 
创建用户并授权:用户:rel1 密码:slavepass
 
mysql> CREATE USER 'repl'@'123.57.44.85' IDENTIFIED BY 'slavepass';#创建用户
 
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'123.57.44.85';#分配权限
 
mysql>flush privileges;   #刷新权限
 
3. 查看 master 状态,记录二进制文件名 (mysql-bin.000003) 和位置 (73):
 
mysql > SHOW MASTER STATUS;
 
+------------------+----------+--------------+------------------+
 
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
 
+------------------+----------+--------------+------------------+
 
| mysql-bin.000003 | 73       | test         | manual,mysql     |
 
+------------------+----------+--------------+------------------+
 
二、从服务器 slave 修改:
 
1. 修改 mysql 配置
 
同样找到 my.cnf 配置文件,添加 server-id
 
[mysqld]
 
server-id=2 #设置server-id,必须唯一
 
2. 重启 mysql,打开 mysql 会话,执行同步 SQL 语句 (需要主服务器主机名,登陆凭据,二进制文件的名称和位置):
 
mysql> CHANGE MASTER TO
 
    ->     MASTER_HOST='182.92.172.80',
 
    ->     MASTER_USER='rep1',
 
    ->     MASTER_PASSWORD='slavepass',
 
    ->     MASTER_LOG_FILE='mysql-bin.000003',
 
    ->     MASTER_LOG_POS=73;
 
3. 启动 slave 同步进程:
 
mysql>start slave;
 
4. 查看 slave 状态:
 
mysql> show slave status\G;
 
*************************** 1. row ***************************
 
               Slave_IO_State: Waiting for master to send event
 
                  Master_Host: 182.92.172.80
 
                  Master_User: rep1
 
                  Master_Port: 3306
 
                Connect_Retry: 60
 
              Master_Log_File: mysql-bin.000013
 
          Read_Master_Log_Pos: 11662
 
               Relay_Log_File: mysqld-relay-bin.000022
 
                Relay_Log_Pos: 11765
 
        Relay_Master_Log_File: mysql-bin.000013
 
             Slave_IO_Running: Yes
 
            Slave_SQL_Running: Yes
 
              Replicate_Do_DB:
 
          Replicate_Ignore_DB:
 
        ...
 
当 Slave_IO_Running 和 Slave_SQL_Running 都为 YES 的时候就表示主从同步设置成功了。接下来就可以进行一些验证了,比如在主 master 数据库的 test 数据库的一张表中插入一条数据,在 slave 的 test 库的相同数据表中查看是否有新增的数据即可验证主从复制功能是否有效,还可以关闭 slave(mysql>stop slave;), 然后再修改 master,看 slave 是否也相应修改(停止 slave 后,master 的修改不会同步到 slave),就可以完成主从复制功能的验证了。
 
还可以用到的其他相关参数:
 
master 开启二进制日志后默认记录所有库所有表的操作,可以通过配置来指定只记录指定的数据库甚至指定的表的操作,具体在 mysql 配置文件的 [mysqld] 可添加修改如下选项:
 
# 不同步哪些数据库  
 
binlog-ignore-db = mysql  
 
binlog-ignore-db = test  
 
binlog-ignore-db = information_schema  

# 只同步哪些数据库,除此之外,其他不同步  
 
binlog-do-db = game
 
 
 
 

(编辑:聊城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章