16.表锁(偏读)

表锁特点

  • 表锁偏向**MyISAM**存储引擎,开销小,加锁快,无死锁,锁定粒度大,发生锁冲突的概率最高,并发度最低

    16.1.环境准备

    ```sql

    1、创建表

    CREATE TABLE IF NOT EXISTS book( bookid INT(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT ‘主键’, card INT(10) UNSIGNED NOT NULL COMMENT ‘分类’ ) COMMENT ‘书籍’;

CREATE TABLE mylock( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) )ENGINE=MYISAM DEFAULT CHARSET=utf8 COMMENT=’测试表锁’;

2、插入数据

INSERT INTO mylock(name) VALUES(‘ZhangSan’); INSERT INTO mylock(name) VALUES(‘LiSi’); INSERT INTO mylock(name) VALUES(‘WangWu’); INSERT INTO mylock(name) VALUES(‘ZhaoLiu’);

  1. <a name="e154c324"></a>
  2. ## 16.2.锁表的命令
  3. 1. 查看数据库表锁的命令
  4. ```sql
  5. SHOW OPEN TABLES; # 查看数据库表锁的命令
  1. mylock表上读锁,给book表上写锁**LOCK TABLESmylockREAD,bookWRITE;** ```sql

    给mylock表上读锁,给book表上写锁

    LOCK TABLES mylock READ, book WRITE;

查看当前表的状态

mysql> SHOW OPEN TABLES; +——————————+————————————-+————+——————-+ | Database | Table | In_use | Name_locked | +——————————+————————————-+————+——————-+ | sql_analysis | book | 1 | 0 | | sql_analysis | mylock | 1 | 0 | +——————————+————————————-+————+——————-+

  1. 3. 释放表锁`**UNLOCK TABLES;**`
  2. ```sql
  3. # 释放给表添加的锁
  4. UNLOCK TABLES;
  5. # 查看当前表的状态
  6. mysql> SHOW OPEN TABLES;
  7. +--------------------+-------------------------+--------+-------------+
  8. | Database | Table | In_use | Name_locked |
  9. +--------------------+-------------------------+--------+-------------+
  10. | sql_analysis | book | 0 | 0 |
  11. | sql_analysis | mylock | 0 | 0 |
  12. +--------------------+-------------------------+--------+-------------+

16.3.读锁案例

  1. 打开两个会话,SESSION1mylock表添加读锁

    1. LOCK TABLES `mylock` READ; # 为mylock表添加读锁
  2. 打开两个会话,SESSION1是否可以读自己锁的表?是否可以修改自己锁的表?是否可以读其他的表?

那么SESSION2呢?
能 不能 不能
能 阻塞 能

  1. # SESSION1
  2. # 问题1:SESSION1为mylock表加了读锁,可以读mylock表!
  3. mysql> SELECT * FROM `mylock`;
  4. +----+----------+
  5. | id | name |
  6. +----+----------+
  7. | 1 | ZhangSan |
  8. | 2 | LiSi |
  9. | 3 | WangWu |
  10. | 4 | ZhaoLiu |
  11. +----+----------+
  12. 4 rows in set (0.00 sec)
  13. # 问题2:SESSION1为mylock表加了读锁,不可以修改mylock表!
  14. mysql> UPDATE mylock SET name = 'abc' WHERE id = 1;
  15. ERROR 1099 (HY000): Table mylock was locked with a READ lock and cannot be updated
  16. # 问题3:SESSION1为mylock表加了读锁,不可以读其他的表!
  17. mysql> SELECT * FROM `book`;
  18. ERROR 1100 (HY000): Table 'book' was not locked with LOCK TABLES
  1. # SESSION2
  2. # 问题1:SESSION1为mylock表加了读锁,SESSION2可以读mylock表!
  3. mysql> SELECT * FROM `mylock`;
  4. +----+----------+
  5. | id | name |
  6. +----+----------+
  7. | 1 | ZhangSan |
  8. | 2 | LiSi |
  9. | 3 | WangWu |
  10. | 4 | ZhaoLiu |
  11. +----+----------+
  12. 4 rows in set (0.00 sec)
  13. # 问题2:SESSION1为mylock表加了读锁,SESSION2修改mylock表会被阻塞,
  14. # 需要等待SESSION1释放mylock表!
  15. mysql> UPDATE `mylock` SET `name` = 'abc' WHERE `id` = 1;
  16. ^C^C -- query aborted
  17. ERROR 1317 (70100): Query execution was interrupted
  18. # 问题3:SESSION1为mylock表加了读锁,SESSION2可以读其他表!
  19. mysql> SELECT * FROM `book`;
  20. +--------+------+
  21. | bookid | card |
  22. +--------+------+
  23. | 1 | 1 |
  24. | 7 | 4 |
  25. | 8 | 4 |
  26. | 9 | 5 |
  27. | 5 | 6 |
  28. | 17 | 6 |
  29. | 15 | 8 |
  30. +--------+------+
  31. 24 rows in set (0.00 sec)

16.4.写锁案例

  1. 打开两个会话,SESSION1mylock表添加写锁

    1. # 为mylock表添加写锁
    2. LOCK TABLES mylock WRITE;
  2. 打开两个会话,SESSION1是否可以读自己锁的表?是否可以修改自己锁的表?是否可以读其他的表?

那么SESSION2呢?
能 能 不能
阻塞 阻塞 能

  1. # SESSION1
  2. # 问题1:SESSION1为mylock表加了写锁,可以读mylock的表!
  3. mysql> SELECT * FROM `mylock`;
  4. +----+----------+
  5. | id | name |
  6. +----+----------+
  7. | 1 | ZhangSan |
  8. | 2 | LiSi |
  9. | 3 | WangWu |
  10. | 4 | ZhaoLiu |
  11. +----+----------+
  12. 4 rows in set (0.00 sec)
  13. # 问题2:SESSION1为mylock表加了写锁,可以修改mylock表!
  14. mysql> UPDATE `mylock` SET `name` = 'abc' WHERE `id` = 1;
  15. Query OK, 1 row affected (0.00 sec)
  16. Rows matched: 1 Changed: 1 Warnings: 0
  17. # 问题3:SESSION1为mylock表加了写锁,不能读其他表!
  18. mysql> SELECT * FROM `book`;
  19. ERROR 1100 (HY000): Table 'book' was not locked with LOCK TABLES
  20. # SESSION2
  21. # 问题1:SESSION1为mylock表加了写锁,SESSION2读mylock表会阻塞,等待SESSION1释放!
  22. mysql> SELECT * FROM `mylock`;
  23. ^C^C -- query aborted
  24. ERROR 1317 (70100): Query execution was interrupted
  25. # 问题2:SESSION1为mylock表加了写锁,SESSION2读mylock表会阻塞,等待SESSION1释放!
  26. mysql> UPDATE `mylock` SET `name` = 'abc' WHERE `id` = 1;
  27. ^C^C -- query aborted
  28. ERROR 1317 (70100): Query execution was interrupted
  29. # 问题3:SESSION1为mylock表加了写锁,SESSION2可以读其他表!
  30. mysql> SELECT * FROM `book`;
  31. +--------+------+
  32. | bookid | card |
  33. +--------+------+
  34. | 1 | 1 |
  35. | 7 | 4 |
  36. | 8 | 4 |
  37. | 9 | 5 |
  38. | 5 | 6 |
  39. | 17 | 6 |
  40. | 15 | 8 |
  41. +--------+------+
  42. 24 rows in set (0.00 sec)

16.5.案例结论

**MyISAM**引擎在执行查询语句**SELECT**之前,会自动给涉及到的所有表加读锁,在执行增删改之前,会自动给涉及的表加写锁。
MySQL的表级锁有两种模式

  • 表共享读锁(Table Read Lock)
  • 表独占写锁(Table Write Lock)

MyISAM表进行操作,会有以下情况

  • 读操作(加读锁),不会阻塞其他线程対同一表的读操作,但是会阻塞其他线程対同一表的写操作。只有当读锁释放之后,才会执行其他线程的写操作
  • 写操作(加写锁),会阻塞其他线程対同一表的读和写操作,只有当写锁释放之后,才会执行其他线程的读写操作
  • 简言之,就是读锁会阻塞写,但不会阻塞读。而写锁会把读跟写都阻塞

    16.6.表锁分析

    1. mysql> SHOW STATUS LIKE 'table%';
    2. +----------------------------+-------+
    3. | Variable_name | Value |
    4. +----------------------------+-------+
    5. | Table_locks_immediate | 173 |
    6. | Table_locks_waited | 0 |
    7. | Table_open_cache_hits | 5 |
    8. | Table_open_cache_misses | 8 |
    9. | Table_open_cache_overflows | 0 |
    10. +----------------------------+-------+
    11. 5 rows in set (0.00 sec)

    可以通过 **Table_locks_immediate****Table_locks_waited** 状态变量来分析系统上的表锁定。具体说明如下

  • Table_locks_immediate产生表级锁定的次数,表示可以立即获取锁的查询次数,每立即获取锁值加1

  • Table_locks_waited出现表级锁定争用而发生等待的次数(不能立即获取锁的次数,每等待一次锁值加1),此值高则说明存在较严重的表级锁争用情况

此外,**MyISAM**的读写锁调度是写优先,这也是**MyISAM**不适合作为主表的引擎。因为写锁后,其他线程不能进行任何操作,大量的写操作会使查询很难得到锁,从而造成永远阻塞

17.行锁(偏写)

行锁特点

  • 偏向InnoDB存储引擎,开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度最高

**InnoDB**存储引擎和**MyISAM**存储引擎最大不同有两点:一是支持事务,二是采用行锁

事务的ACID

  • Atomicity [ˌætəˈmɪsəti]
  • Consistency [kənˈsɪstənsi]
  • Isolation [ˌaɪsəˈleɪʃn]
  • Durability [ˌdjʊərəˈbɪlɪti]

    17.1.环境准备

    ```sql

    建表语句

    CREATE TABLE test_innodb_lock( a INT, b VARCHAR(16) )ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT=’测试行锁’;

插入数据

INSERT INTO test_innodb_lock(a, b) VALUES(1, ‘b2’); INSERT INTO test_innodb_lock(a, b) VALUES(2, ‘3’); INSERT INTO test_innodb_lock(a, b) VALUES(3, ‘4000’); INSERT INTO test_innodb_lock(a, b) VALUES(4, ‘5000’); INSERT INTO test_innodb_lock(a, b) VALUES(5, ‘6000’); INSERT INTO test_innodb_lock(a, b) VALUES(6, ‘7000’); INSERT INTO test_innodb_lock(a, b) VALUES(7, ‘8000’); INSERT INTO test_innodb_lock(a, b) VALUES(8, ‘9000’);

创建索引

CREATE INDEX idx_test_a ON test_innodb_lock(a); CREATE INDEX idx_test_b ON test_innodb_lock(b);

  1. <a name="71a2fc60"></a>
  2. ## 17.2.行锁案例
  3. 1. 打开`SESSION1`和`SESSION2`两个会话,都开启手动提交
  4. ```sql
  5. # 开启MySQL数据库的手动提交
  6. mysql> SET autocommit=0;
  7. Query OK, 0 rows affected (0.00 sec)
  1. 读自己所写 ```shell

    SESSION1

SESSION1 对test_innodb_lock表做写操作,但是没有commit

执行修改SQL之后,查询一下test_innodb_lock表,发现数据被修改了

mysql> UPDATE test_innodb_lock SET b = ‘88’ WHERE a = 1; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0

mysql> SELECT * FROM test_innodb_lock; +———+———+ | a | b | +———+———+ | 1 | 88 | | 2 | 3 | | 3 | 4000 | | 4 | 5000 | | 5 | 6000 | | 6 | 7000 | | 7 | 8000 | | 8 | 9000 | +———+———+ 8 rows in set (0.00 sec)

SESSION2

SESSION2 这时候来查询test_innodb_lock表。

发现SESSION2是读不到SESSION1未提交的数据的。

mysql> SELECT * FROM test_innodb_lock; +———+———+ | a | b | +———+———+ | 1 | b2 | | 2 | 3 | | 3 | 4000 | | 4 | 5000 | | 5 | 6000 | | 6 | 7000 | | 7 | 8000 | | 8 | 9000 | +———+———+ 8 rows in set (0.00 se

  1. 3. 行锁两个SESSION同时対一条记录进行写操作
  2. ```shell
  3. # SESSION1 対test_innodb_lock表的`a`=1这一行进行写操作,但是没有commit
  4. mysql> UPDATE `test_innodb_lock` SET `b` = '99' WHERE `a` = 1;
  5. Query OK, 1 row affected (0.00 sec)
  6. Rows matched: 1 Changed: 1 Warnings: 0
  7. # SESSION2 也对test_innodb_lock表的`a`=1这一行进行写操作,但是发现阻塞了!!!
  8. # 等SESSION1执行commit语句之后,SESSION2的SQL就会执行了
  9. mysql> UPDATE `test_innodb_lock` SET `b` = 'asdasd' WHERE `a` = 1;
  10. ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
  1. 行锁两个SESSION同时对不同记录进行写操作 ```shell

    SESSION1 対test_innodb_lock表的a=6这一行进行写操作,但是没有commit

    mysql> UPDATE test_innodb_lock SET b = ‘8976’ WHERE a = 6; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0

SESSION2 対test_innodb_lock表的a=4这一行进行写操作,没有阻塞!!!

SESSION1和SESSION2同时对不同的行进行写操作互不影响

mysql> UPDATE test_innodb_lock SET b = ‘Ringo’ WHERE a = 4; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0

  1. <a name="6d9018ac"></a>
  2. ## 17.3.索引失效行锁变表锁
  3. ```shell
  4. # SESSION1 执行SQL语句,没有执行commit
  5. # 由于`b`字段是字符串,但是没有加单引号导致索引失效
  6. mysql> UPDATE `test_innodb_lock` SET `a` = 888 WHERE `b` = 8000;
  7. Query OK, 1 row affected, 1 warning (0.00 sec)
  8. Rows matched: 1 Changed: 1 Warnings: 1
  9. # SESSION2 和SESSION1操作的并不是同一行,但是也被阻塞了???
  10. # 由于SESSION1执行的SQL索引失效,导致行锁升级为表锁
  11. mysql> UPDATE `test_innodb_lock` SET `b` = '1314' WHERE `a` = 1;
  12. ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

17.4.间隙锁的危害

什么是间隙锁
当我们用范围条件而不是相等条件检索数据,并请求共享或者排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁,对于键值在条件范文内但并不存在的记录,叫做”间隙(GAP)”

InnoDB也会对这个”间隙”加锁,这种锁的机制就是所谓的”间隙锁”

间隙锁的危害
因为Query执行过程中通过范围查找的话,他会锁定整个范围内所有的索引键值,即使这个键值不存在

间隙锁有一个比较致命的缺点,就是当锁定一个范围的键值后,即使某些不存在的键值也会被无辜的锁定,而造成在锁定的时候无法插入锁定键值范围内的任何数据。在某些场景下这可能会対性能造成很大的危害

17.5.如何锁定一行

MySQL高级 4 表锁 行锁 主从复制 - 图1
**SELECT .....FOR UPDATE**在锁定某一行后,其他写操作会被阻塞,直到锁定的行被COMMIT

mysql``InnoDB引擎默认的修改数据语句,update``delete``insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类型,如果加排他锁可以使用select ...for update语句,加共享锁可以使用**select ... lock in share mode**语句。所以加过排他锁的数据行在其他事务中是不能修改数据的,也不能通过for updatelock in share mode锁的方式查询数据,但可以直接通过select ...from...查询数据,因为普通查询没有任何锁机制
MySQL高级 4 表锁 行锁 主从复制 - 图2

17.6.案例结论

InnoDB存储引擎由于实现了行级锁定,虽然在锁定机制的实现方面所带来的性能损耗可能比表级锁定会要更高一些,但是在整体并发处理能力要远远优于MyISAM的表级锁定的。当系统并发量较高的时候,InnoDB的整体性能和MyISAM相比就会有比较明显的优势

但是,InnoDB的行级锁定同样也有其脆弱的一面,当我们使用不当的时候,可能会让InnoDB的整体性能表现不仅不能比MyISAM高,甚至可能会更差

17.7.行锁分析

  1. mysql> SHOW STATUS LIKE 'innodb_row_lock%';
  2. +-------------------------------+--------+
  3. | Variable_name | Value |
  4. +-------------------------------+--------+
  5. | Innodb_row_lock_current_waits | 0 |
  6. | Innodb_row_lock_time | 124150 |
  7. | Innodb_row_lock_time_avg | 31037 |
  8. | Innodb_row_lock_time_max | 51004 |
  9. | Innodb_row_lock_waits | 4 |
  10. +-------------------------------+--------+
  11. 5 rows in set (0.00 sec)

対各个状态量的说明如下:

  • **Innodb_row_lock_current_waits**当前正在等待锁定的数量
  • **Innodb_row_lock_time**从系统启动到现在锁定总时间长度(重要)
  • **Innodb_row_lock_time_avg**每次等待所花的平均时间(重要)
  • **Innodb_row_lock_time_max**从系统启动到现在等待最长的一次所花的时间
  • **Innodb_row_lock_waits**系统启动后到现在总共等待的次数(重要)

尤其是当等待次数很高,且每次等待时长也不小的时候,就需要分析系统中为什么会有如此多的等待,然后根据分析结果着手制定优化策略

优化建议

  • 尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁
  • 合理设计索引,尽量缩小锁的范围
  • 尽可能较少检索条件,避免间隙锁
  • 尽量控制事务大小,减少锁定资源量和时间长度
  • 尽可能低级别事务隔离

    18.主从复制

    18.1.复制基本原理

    MySQL高级 4 表锁 行锁 主从复制 - 图3
    MySQL复制过程分为三步

  • Master将改变记录到二进制日志Binary Log。这些记录过程叫做二进制日志事件,Binary Log Events

  • SlaveMasterBinary Log Events拷贝到它的中继日志Replay Log
  • Slave重做中继日志中的事件,将改变应用到自己的数据库中。MySQL复制是异步且串行化的

    18.2.复制基本原则

  • 每个Slave只有一个Master

  • 每个Slave只能有一个唯一的服务器ID
  • 每个Master可以有多个Salve

    18.3.一主一从配置

  1. 基本要求:MasterSlaveMySQL服务器版本一致且后台以服务运行
  2. 主从配置都是配在[mysqld]节点下,都是小写

    1. # docker创建mysql-slave1实例
    2. docker run -p 3307:3306 --name mysql-slave1 \
    3. -v /root/mysql-slave1/log:/var/log/mysql \
    4. -v /root/mysql-slave1/data:/var/lib/mysql \
    5. -v /root/mysql-slave1/conf:/etc/mysql \
    6. -e MYSQL_ROOT_PASSWORD=root \
    7. -d mysql:5.7
    1. # Master配置
    2. [mysqld]
    3. server-id=1 # 必须
    4. log-bin=/var/lib/mysql/mysql-bin # 必须 启用二进制日志
    5. log-err=本地路径/mysql-err # 可选 启用错误日志
    6. basedir=本地路径 # 可选 根目录
    7. tmpdir=本地路径 # 可选 临时目录
    8. read-only=0 # 主机 读写都可以
    9. binlog-ignore-db=mysql # 可选 设置不要复制的数据库
    10. binlog-do-db=ww2 # 可选 设置需要复制的数据库
    1. # Slave配置
    2. [mysqld]
    3. server-id=2 # 必须
    4. log-bin=/var/lib/mysql/mysql-bin
  3. Master建立账户并授权给slave ```sql

    1、GRANT REPLICATION SLAVE ON . TO ‘username’@’从机IP地址’ IDENTIFIED BY ‘password’;

    mysql> GRANT REPLICATION SLAVE ON . TO ‘zhangsan’@’192.168.199.158’ IDENTIFIED BY ‘123456’; Query OK, 0 rows affected, 1 warning (0.01 sec)

2、刷新命令

mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec)

3、记录下File和Position

每次配从机的时候都要SHOW MASTER STATUS;查看最新的File和Position

mysql> SHOW MASTER STATUS; +—————————+—————+———————+—————————+—————————-+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +—————————+—————+———————+—————————+—————————-+ | mysql-bin.000001 | 602 | | mysql | | +—————————+—————+———————+—————————+—————————-+ 1 row in set (0.00 sec)

  1. 4. Slave从机配置
  2. ```shell
  3. CHANGE MASTER TO MASTER_HOST='192.168.199.132',
  4. MASTER_USER='zhangsan',
  5. MASTER_PASSWORD='123456',
  6. MASTER_LOG_FILE='mysql-bin.File的编号',
  7. MASTER_LOG_POS=Position的最新值;
  1. # 1、使用用户名密码登录进Master
  2. mysql> CHANGE MASTER TO MASTER_HOST='192.168.199.132',
  3. -> MASTER_USER='zhangsan',
  4. -> MASTER_PASSWORD='123456',
  5. -> MASTER_LOG_FILE='mysql-bin.000001',
  6. -> MASTER_LOG_POS=602;
  7. Query OK, 0 rows affected, 2 warnings (0.02 sec)
  8. # 2、开启Slave从机的复制
  9. mysql> START SLAVE;
  10. Query OK, 0 rows affected (0.00 sec)
  11. # 3、查看Slave状态
  12. # Slave_IO_Running 和 Slave_SQL_Running 必须同时为Yes 说明主从复制配置成功!
  13. mysql> SHOW SLAVE STATUS\G
  14. *************************** 1. row ***************************
  15. Slave_IO_State: Waiting for master to send event # Slave待命状态
  16. Master_Host: 172.18.0.4
  17. Master_User: zhangsan
  18. Master_Port: 3306
  19. Connect_Retry: 60
  20. Master_Log_File: mysql-bin.000001
  21. Read_Master_Log_Pos: 602
  22. Relay_Log_File: b030ad25d5fe-relay-bin.000002
  23. Relay_Log_Pos: 320
  24. Relay_Master_Log_File: mysql-bin.000001
  25. Slave_IO_Running: Yes # 必须同时为Yes
  26. Slave_SQL_Running: Yes # 必须同时为Yes
  27. Replicate_Do_DB:
  28. Replicate_Ignore_DB:
  29. Replicate_Do_Table:
  30. Replicate_Ignore_Table:
  31. Replicate_Wild_Do_Table:
  32. Replicate_Wild_Ignore_Table:
  33. Last_Errno: 0
  34. Last_Error:
  35. Skip_Counter: 0
  36. Exec_Master_Log_Pos: 602
  37. Relay_Log_Space: 534
  38. Until_Condition: None
  39. Until_Log_File:
  40. Until_Log_Pos: 0
  41. Master_SSL_Allowed: No
  42. Master_SSL_CA_File:
  43. Master_SSL_CA_Path:
  44. Master_SSL_Cert:
  45. Master_SSL_Cipher:
  46. Master_SSL_Key:
  47. Seconds_Behind_Master: 0
  48. Master_SSL_Verify_Server_Cert: No
  49. Last_IO_Errno: 0
  50. Last_IO_Error:
  51. Last_SQL_Errno: 0
  52. Last_SQL_Error:
  53. Replicate_Ignore_Server_Ids:
  54. Master_Server_Id: 1
  55. Master_UUID: bd047557-b20c-11ea-9961-0242ac120002
  56. Master_Info_File: /var/lib/mysql/master.info
  57. SQL_Delay: 0
  58. SQL_Remaining_Delay: NULL
  59. Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
  60. Master_Retry_Count: 86400
  61. Master_Bind:
  62. Last_IO_Error_Timestamp:
  63. Last_SQL_Error_Timestamp:
  64. Master_SSL_Crl:
  65. Master_SSL_Crlpath:
  66. Retrieved_Gtid_Set:
  67. Executed_Gtid_Set:
  68. Auto_Position: 0
  69. Replicate_Rewrite_DB:
  70. Channel_Name:
  71. Master_TLS_Version:
  72. 1 row in set (0.00 sec)
  1. 测试主从复制 ```shell

    Master创建数据库

    mysql> create database test_replication; Query OK, 1 row affected (0.01 sec)

Slave查询数据库

mysql> show databases; +——————————+ | Database | +——————————+ | information_schema | | mysql | | performance_schema | | sys | | test_replication | +——————————+ 5 rows in set (0.00 sec)

  1. 6. 停止主从复制功能
  2. ```shell
  3. # 1、停止Slave
  4. mysql> STOP SLAVE;
  5. Query OK, 0 rows affected (0.00 sec)
  6. # 2、重新配置主从
  7. # MASTER_LOG_FILE 和 MASTER_LOG_POS一定要根据最新的数据来配
  8. mysql> CHANGE MASTER TO MASTER_HOST='172.18.0.4',
  9. -> MASTER_USER='zhangsan',
  10. -> MASTER_PASSWORD='123456',
  11. -> MASTER_LOG_FILE='mysql-bin.000001',
  12. -> MASTER_LOG_POS=797;
  13. Query OK, 0 rows affected, 2 warnings (0.01 sec)
  14. mysql> START SLAVE;
  15. Query OK, 0 rows affected (0.00 sec)
  16. mysql> SHOW SLAVE STATUS\G
  17. *************************** 1. row ***************************
  18. Slave_IO_State: Waiting for master to send event
  19. Master_Host: 172.18.0.4
  20. Master_User: zhangsan
  21. Master_Port: 3306
  22. Connect_Retry: 60
  23. Master_Log_File: mysql-bin.000001
  24. Read_Master_Log_Pos: 797
  25. Relay_Log_File: b030ad25d5fe-relay-bin.000002
  26. Relay_Log_Pos: 320
  27. Relay_Master_Log_File: mysql-bin.000001
  28. Slave_IO_Running: Yes
  29. Slave_SQL_Running: Yes
  30. Replicate_Do_DB:
  31. Replicate_Ignore_DB:
  32. Replicate_Do_Table:
  33. Replicate_Ignore_Table:
  34. Replicate_Wild_Do_Table:
  35. Replicate_Wild_Ignore_Table:
  36. Last_Errno: 0
  37. Last_Error:
  38. Skip_Counter: 0
  39. Exec_Master_Log_Pos: 797
  40. Relay_Log_Space: 534
  41. Until_Condition: None
  42. Until_Log_File:
  43. Until_Log_Pos: 0
  44. Master_SSL_Allowed: No
  45. Master_SSL_CA_File:
  46. Master_SSL_CA_Path:
  47. Master_SSL_Cert:
  48. Master_SSL_Cipher:
  49. Master_SSL_Key:
  50. Seconds_Behind_Master: 0
  51. Master_SSL_Verify_Server_Cert: No
  52. Last_IO_Errno: 0
  53. Last_IO_Error:
  54. Last_SQL_Errno: 0
  55. Last_SQL_Error:
  56. Replicate_Ignore_Server_Ids:
  57. Master_Server_Id: 1
  58. Master_UUID: bd047557-b20c-11ea-9961-0242ac120002
  59. Master_Info_File: /var/lib/mysql/master.info
  60. SQL_Delay: 0
  61. SQL_Remaining_Delay: NULL
  62. Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
  63. Master_Retry_Count: 86400
  64. Master_Bind:
  65. Last_IO_Error_Timestamp:
  66. Last_SQL_Error_Timestamp:
  67. Master_SSL_Crl:
  68. Master_SSL_Crlpath:
  69. Retrieved_Gtid_Set:
  70. Executed_Gtid_Set:
  71. Auto_Position: 0
  72. Replicate_Rewrite_DB:
  73. Channel_Name:
  74. Master_TLS_Version:
  75. 1 row in set (0.00 sec)