MySQL数据库入门到精通——进阶篇(3)
黑马程序员 MySQL数据库入门到精通——进阶篇(3)
- 1. 锁
- 1.1 锁-介绍
- 1.2 锁-全局锁
- 1.3 锁-表级锁
- 1.3.1 表级锁-表锁
- 1.3.2 表级锁元数据锁( meta data lock,MDL)
- 1.3.3 表级锁-意向锁
- 1.3.4 表级锁意向锁测试
- 1.4 锁-行级锁
- 1.4.1 行级锁-行锁
- 1.4.2 行级锁-间隙锁&临键锁1
- 1.4.3 行级锁-间隙锁&临键锁2
- 2. InnoDB引擎
- 2.1 逻辑存储结构
- 2.2 架构
- 2.2.1 内存结构1
- 2.2.2 内存结构2
- 2.2.3 磁盘结构
- 2.2.4 后台线程
- 2.3 事务原理
- 2.3.1 redo log(持久性)
- 2.3.2 undo log(原子性)
- 2.4 MVCC
- 2.4.1 隐藏字段
- 2.4.2 undo log版本链
- 2.4.3 readview介绍
- 2.4.4 原理分析RC级别
- 2.4.5 原理分析RR级别
- =====================================================
- 3. MySQL管理(了解)
- 3.1 MySQL管理-系统数据库介绍
- 3.2 MySQL管理-常用工具
- 3.2.1 mysql
- 3.2.2 mysqladmin
- 3.2.3 mysqlbinlog
- 3.2.4 mysqlshow
- 3.2.5 mysqldump
- 3.2.6 mysqlimport/source
- 3.3 MySQL管理-小结


1. 锁
1.1 锁-介绍
锁是计算机协调多个进程或线程并发访问某一资源的机制。 在数据库中,除传统的计算资源(CPU、RAM、I/O) 的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。
🐬🐬🐬 MySQL中的锁,按照锁的力度分,分为以下三类:
- 全局锁:锁定数据库中的所有表。
- 表级锁:每次操作锁住整张表。
- 行级锁:每次操作锁住对应的行数据。

1.2 锁-全局锁
🐬🐬🐬全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL语句,已经更新操作的事务提交语句都将被阻塞。
🐬🐬🐬其典型的使用场景是做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性。

一致性数据备份


flush tables with read lock;
mysqldump -uroot -p1234 itcast>itcast.sql(换成自己的用户名与密码)
unlock tables;


特点
数据库中加全局锁,是一一个比较重的操作,存在以下问题:
- 如果在主库上备份,那么在备份期间都不能执行更新,业务基本.上就得停摆。
- 如果在从库 上备份,那么在备份期间从库不能执行主库同步过来的二进制日志(binlog) ,会导致主从延迟。
🐬🐬🐬在InnoDB引擎中,我们可以在备份时加上参数–single-transaction参数来完成不加锁的-致性数据备份。
mysqldump --single-transaction -uroot -p123456 itcast>itcast.sql

1.3 锁-表级锁
表级锁,每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低。应用在MyISAM、 InnoDB、BDB等存储引擎中。
🐬🐬🐬 对于表级锁,主要分为以下三类:
- 表锁
- 元数据锁( meta data lock, MDL)
- 意向锁
1.3.1 表级锁-表锁
对于表锁,分为两类:
- 表共享读锁(read lock),当前客户端是可读可写的,其他客户端不会阻塞读,但是会阻塞其他客户端的写
- 表独占写锁(write ldek),当前客户端是可读可写的,其他客户端不会阻塞写,不会阻塞其他客户端的读
语法:
- 加锁: lock tables表名…read/write。
- 释放锁: unlock tables / 客户端断开连接。



1.3.2 表级锁元数据锁( meta data lock,MDL)
MDL加锁过程是系统自动控制,无需显式使用,在访问一张表的时候会自动加上。
MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作。
为了避免DML与RDL冲突,保证读写的正确性。
在MySQL5.5中引入了MDL,当对一张表 进行增删改查的时候,加MDL读锁(共享);当对表结构进行变更操作的时候,加MDL写锁(排他)。
| 对应SQL | 锁类型 | 说明 |
|---|---|---|
| lock tables xxx read / write | SHARED_READ_ONLY / SHARED NO_READ_WRITE | |
| select、select … lock in share mode | SHARED_READ(共享读锁) | 与SHARED_READ、SHARED WRITE兼容,与EXCLUSIVE互斥 |
| insert、update、 delete、 select … for update | SHARED_WRITE | 与SHARED_READ、SHARED_WRITE兼容 ,与EXCLUSIVE互斥 |
| alter table … | EXCLUSIVE(排他锁) | 与其他的MDL都互斥 |
查看元数据锁:
select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks ;


1.3.3 表级锁-意向锁


为了避免DML在执行时,加的行锁与表锁的冲突,在InnoDB中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查。

- 意向共享锁(IS):由语句select … lock in share mode添加。
- 意向排他锁 (IX):由insert、 update、delete、 select … for update添加。
可以通过以下SQL,查看意向锁及行锁的加锁情况:
select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;

1.3.4 表级锁意向锁测试



1.4 锁-行级锁
🐬🐬🐬行级锁,每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。应用在InnoDB存储引擎中。
InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁。对于行级锁,主要分为以下三类:
- 行锁(Record Lock) :锁定单个行记录的锁,防止其他事务对此行进行update和delete。在RC、RR隔离级别下都支持。

- 间隙锁(Gap Lock) :锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个间隙进行insert,产生幻读。在RR隔离级别下都支持。

- 临键锁(Next-Key Lock) :行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap。在RR隔离级别下支持。


1.4.1 行级锁-行锁
InnoDB实现了以下两种类型的行锁:
- 共享锁(S) :允许一个事务去读一行,阻止其他事务获得相同数据集的排它锁。
- 排他锁 (X) :允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他锁。

| SQL | 行锁类型 | 说明 |
|---|---|---|
| INSERT … | 排他锁 | 自动加锁 |
| UPDATE … | 排他锁 | 自动加锁 |
| DELETE … | 排他锁 | 自动加锁 |
| SELECT (正常) | 不加任何锁 | SELECT … LOCK IN SHARE MODE |
| 共享锁 | 需要手动 | 在SELECT之后加LOCK IN SHARE MODE |
| SELECT … FOR UPDATE | 排他锁 | 需要手动在SELECT之后加FOR UPDATE |
行锁-演示
默认情况下,InnoDB在REPEATABLE READ事务隔离级别运行,InnoDB使用next-key锁进行搜索和索引扫描,以防止幻读。
- 针对唯一索引进行检索时,对已存在的记录进行等值匹配时,将会自动优化为行锁。
- InnoDB的行锁是针对于索引加的锁,不通过索引条件检索数据,那么InnoDB将对表中的所有记录加锁,此时就会升级为表锁。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mybatis |
| mysql |
| performance_schema |
| sakila |
| sys |
| test |
| tlias |
| world |
+--------------------+
9 rows in set (0.00 sec)mysql> use test
Database changed
mysql> select * from stu;
+----+-----+-------+
| id | age | name |
+----+-----+-------+
| 1 | 1 | tom |
| 3 | 3 | cat |
| 8 | 8 | rose |
| 11 | 11 | jetty |
| 19 | 19 | lily |
| 25 | 25 | luci |
+----+-----+-------+
6 rows in set (0.00 sec)mysql>
可以通过以下SQL,查看意向锁及行锁的加锁情况:
select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;
mysql> select * from stu where id = 1;
+----+-----+------+
| id | age | name |
+----+-----+------+
| 1 | 1 | tom |
+----+-----+------+
1 row in set (0.00 sec)mysql> select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;
Empty set (0.00 sec)
T1
mysql> begin;
Query OK, 0 rows affected (0.00 sec)mysql> select * from stu where id = 1 lock in share mode;
+----+-----+------+
| id | age | name |
+----+-----+------+
| 1 | 1 | tom |
+----+-----+------+
1 row in set (0.00 sec)
T2
mysql> use test;
Database changed
mysql> select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;
Empty set (0.00 sec)mysql> select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;
+---------------+-------------+------------+-----------+---------------+-----------+
| object_schema | object_name | index_name | lock_type | lock_mode | lock_data |
+---------------+-------------+------------+-----------+---------------+-----------+
| test | stu | NULL | TABLE | IS | NULL |
| test | stu | PRIMARY | RECORD | S,REC_NOT_GAP | 1 |
+---------------+-------------+------------+-----------+---------------+-----------+
2 rows in set (0.00 sec)

1.4.2 行级锁-间隙锁&临键锁1
间隙锁/临键锁-演示
默认情况下,InnoDB在REPEATABLE READ事务隔离级别运行,InnoDB使用next-key锁进行搜索和索引扫描,以防止幻读。
- 索引上的等值查询(唯一索引),给不存在的记录加锁时,优化为间隙锁。
- 索引上的等值查询(普通索引),向右遍历时最后一个值不满足查询需求时,next-key lock退化为间隙锁。
- 索引上的范围查询(唯一 索引)——会访问到不满足条件的第一个值为止。
注意:间隙锁唯一目的是防止其他事务插入间隙。间隙锁可以共存,一个事务采用的间隙锁不会阻止另一个事务在同一间隙上采用间隙锁。
T1
mysql> select * from stu;
+----+-----+-------+
| id | age | name |
+----+-----+-------+
| 1 | 1 | tom |
| 3 | 3 | cat |
| 8 | 8 | rose |
| 11 | 11 | jetty |
| 19 | 19 | lily |
| 25 | 25 | luci |
+----+-----+-------+
6 rows in set (0.00 sec)mysql> begin;
Query OK, 0 rows affected (0.00 sec)mysql> update stu set age = 10 where id =5;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0 Changed: 0 Warnings: 0mysql>
T2
mysql> select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;
+---------------+-------------+------------+-----------+-----------+-----------+
| object_schema | object_name | index_name | lock_type | lock_mode | lock_data |
+---------------+-------------+------------+-----------+-----------+-----------+
| test | stu | NULL | TABLE | IX | NULL |
| test | stu | PRIMARY | RECORD | X,GAP | 8 |
+---------------+-------------+------------+-----------+-----------+-----------+
2 rows in set (0.00 sec)mysql> begin;
Query OK, 0 rows affected (0.00 sec)mysql> insert into stu values(7,7,'Ruby');
T1
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
T2
Query OK, 1 row affected (24.87 sec)mysql> select * from stu;
+----+-----+-------+
| id | age | name |
+----+-----+-------+
| 1 | 1 | tom |
| 3 | 3 | cat |
| 7 | 7 | Ruby |
| 8 | 8 | rose |
| 11 | 11 | jetty |
| 19 | 19 | lily |
| 25 | 25 | luci |
+----+-----+-------+
7 rows in set (0.00 sec)

1.4.3 行级锁-间隙锁&临键锁2
间隙锁/临键锁-演示
默认情况下,InnoDB在REPEATABLE READ事务隔离级别运行,InnoDB使用next-key锁进行搜索和索引扫描,以防止幻读。
- 索引上的等值查询(唯一索引),给不存在的记录加锁时,优化为间隙锁。
- 索引上的等值查询(普通索引),向右遍历时最后一个值不满足查询需求时,next-key lock退化为间隙锁。
- 索引上的范围查询(唯一 索引)——会访问到不满足条件的第一个值为止。

age 不是唯一索引
mysql> select * from stu where age = 3 lock in share mode;
+----+-----+------+
| id | age | name |
+----+-----+------+
| 3 | 3 | cat |
+----+-----+------+
1 row in set (0.00 sec)mysql> select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;
+---------------+-------------+------------+-----------+---------------+-----------+
| object_schema | object_name | index_name | lock_type | lock_mode | lock_data |
+---------------+-------------+------------+-----------+---------------+-----------+
| test | stu | NULL | TABLE | IS | NULL |
| test | stu | idx_t_age | RECORD | S | 3, 3 |
| test | stu | PRIMARY | RECORD | S,REC_NOT_GAP | 3 |
| test | stu | idx_t_age | RECORD | S,GAP | 7, 7 |
+---------------+-------------+------------+-----------+---------------+-----------+
4 rows in set (0.00 sec)
间隙锁/临键锁-演示
默认情况下,InnoDB在REPEATABLE READ事务隔离级别运行,InnoDB使用next-key锁进行搜索和索引扫描,以防止幻读。
- 索引上的等值查询(唯一索引),给不存在的记录加锁时,优化为间隙锁。
- 索引上的等值查询(普通索引),向右遍历时最后一个值不满足查询需求时,next-key lock退化为间隙锁。
- 索引上的范围查询(唯一 索引)——会访问到不满足条件的第一个值为止。
mysql> select * from stu where id>=19 lock in share mode;
+----+-----+------+
| id | age | name |
+----+-----+------+
| 19 | 19 | lily |
| 25 | 25 | luci |
+----+-----+------+
2 rows in set (0.00 sec)mysql> select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;
+---------------+-------------+------------+-----------+---------------+------------------------+
| object_schema | object_name | index_name | lock_type | lock_mode | lock_data |
+---------------+-------------+------------+-----------+---------------+------------------------+
| test | stu | NULL | TABLE | IS | NULL |
| test | stu | PRIMARY | RECORD | S,REC_NOT_GAP | 19 |
| test | stu | PRIMARY | RECORD | S | supremum pseudo-record |
| test | stu | PRIMARY | RECORD | S | 25 |
+---------------+-------------+------------+-----------+---------------+------------------------+
4 rows in set (0.00 sec)


2. InnoDB引擎
2.1 逻辑存储结构
InnoDB引擎的逻辑存储结构

- 表空间(ibd文件) ,一个mysql实例可以对应多个表空间,用于存储记录、索引等数据。

- 段,分为数据段(Leaf node segment)、索引段 (Non-leaf node segment)、回滚段( Rollback segment) , InnoDB是索引组织表,数据段就是B+树的叶子节点,索引段即为B+树的非叶子节 点。段用来管理多个Extent (区)。
- 区,表空间的单元结构,每个区的大小为1M。默认情况下,InnoDB存储引擎页大小为16K,即一个区中这共有64个连续的页。
- 页,是InnoDB存储引擎磁盘管理的最小单元,每个页的大小默认为16KB。为了保证页的连续性, InnoDB 存储引擎每次从磁盘申请4-5个区。
- 行,InnoDB存储引擎数据是按行进行存放的。


2.2 架构
MySQL5.5版本开始,默认使用InnoDB存储引擎,它擅长事务处理,具有崩溃恢复特性,在日常开发中使用非常广泛。下面是InnoDB架构图,左侧为内存结构,右侧为磁盘结构。


2.2.1 内存结构1


2.2.2 内存结构2


mysql> show variables like '%hash_index%';
+----------------------------------+-------+
| Variable_name | Value |
+----------------------------------+-------+
| innodb_adaptive_hash_index | ON |
| innodb_adaptive_hash_index_parts | 8 |
+----------------------------------+-------+
2 rows in set, 1 warning (0.01 sec)

mysql> show variables like '%log_buffer_size%';
+------------------------+----------+
| Variable_name | Value |
+------------------------+----------+
| innodb_log_buffer_size | 16777216 |
+------------------------+----------+
1 row in set, 1 warning (0.00 sec)mysql> show variables like '%flush_log%';
+--------------------------------+-------+
| Variable_name | Value |
+--------------------------------+-------+
| innodb_flush_log_at_timeout | 1 |
| innodb_flush_log_at_trx_commit | 1 |
+--------------------------------+-------+
2 rows in set, 1 warning (0.00 sec)
1:日志在每次事务提交时写入并刷新到磁盘
0:每秒将日志写入并刷新到磁盘一次。
2:日志在每次事务提交后写入,并每秒刷新到磁盘一次。

2.2.3 磁盘结构

- System Tablespace:系统表空间是更改缓冲区的存储区域。如果表是在系统表空间而不是每个表
文件或通用表空间中创建的,它也可能包含表和索引数据。(在MySQL5.x版本中还包含InnoDB数据字典、undolog等)
参数:innodb_data_file_path - File-Per-Table Tablespaces:每个表的文件表空间包含单个InnoDB表的数据和索引,并存储在
文件系统上的单个数据文件中。
参数:innodb_file_per_table - General Tablespaces:通用表空间,需要通过CREATE TABLESPACE 语法创建通用表空间,在创建表时,可以指定该表空间。


- Undo Tablespaces:撤销表空间,MySQL实例在初始化时会自动创建两个默认的undo表空间(初始大小16M),用于存储undo log志。
- Temporary Tablespaces: InnoDB 使用会话临时表空间和全局临时表空间。存储用户创建的临时表等数据。
- Doublewrite Buffer Files:双写缓冲区,RinnoDB引擎将数据页从Buffer Pool刷新到磁盘前,先
将数据页写入双写缓冲区文件中,便于系统异常时恢复数据。 - Redo Log:重做日志,是用来实现事务的持久性。该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log) ,前者是在内存中,后者在磁盘中。当事务提交之后会把所有修改信息都会存到该日志中,用于在刷新脏页到磁盘时发生错误时,进行数据恢复使用。

2.2.4 后台线程
内存刷新到磁盘中的后台线程!!!!

- Master Thread
核心后台线程,负责调度其他线程,还负责将缓冲池中的数据异步刷新到磁盘中,保持数据的一致性,还包括脏页的刷新、合并插入缓存、undo页的回收。 - IO Thread
在InnoDB存储引擎中大量使用了AlO来处理IO请求,这样可以极大地提高数据库的性能,而I0
Thread主要负责这些I0请求的回调。
| 线程类型 | 默认个数 | 职责 |
|---|---|---|
| Read thread | 4 | 负责读操作 |
| Write thread | 4 | 负责写操作 |
| Log thread | 1 | 负责将日志缓冲区刷新到磁盘 |
| Insert buffer thread | 1 | 负责将写缓冲区内容刷新到磁盘 |
- Purge Thread
主要用于回收事务已经提交了的undo log,在事务提交之后,undo log可能不用了,就用它来回收。 - Page Cleaner Thread
协助Master Thread刷新脏页到磁盘的线程,它可以减轻Master Thread的工作压力,减少阻塞。

2.3 事务原理
事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体-起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时先败。
特性
- 原子性(Atomicity) :事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
- 一致性(Consistency) :事务完成时,必须使所有的数据都保持一 致状态。
- 隔离性(Isolation) :数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
- 持久性(Durability) :事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。


2.3.1 redo log(持久性)
重做日志,记录的是事务提交时数据页的物理修改,是用来实现事务的持久性。
该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log file) ,前者是在内存中,后者在磁盘中。当事务提交之后会把所有修改信息都存到该日志文件中,用于在刷新脏页到磁盘,发生错误时,进行数据恢复使用。


脏页刷新磁盘发生错误的时候,回滚数据恢复,用的(持久性) ——WAL (Write-Ahead Logging)

2.3.2 undo log(原子性)
🐬🐬🐬回滚日志,用于记录数据被修改前的信息,作用包含两个:提供回滚和MVCC(多版本并发控制)。
-
undo log和redo log记录物理日志不一样,它是逻辑日志。可以认为当delete-条记录时, undo log中会记录一条对 应的insert记录,反之亦然,当update- 条记录时,它记录一条对应相反的update记录。当执行rollback时, 就可以从undo log中的逻辑记录读取到相应的内容并进行回滚。
-
Undo log销毁: undo log在事务执行时产生,事务提交时,并不会立即删除undo log,因为这些日志可能还用于MVCC。
-
Undo log存储: undo log采用段的方式进行管理和记录,存放在前面介绍的rollback segment回滚段中,内部包含1024个undo log segment。

2.4 MVCC
基本概念
当前读
读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。对于我们日常的操作,如:
🐬select ... lgck in share mode(共享锁), select .. for update、update、 insert、 delete(排他锁)都是一 种当前读。
快照读
简单的select(不加锁)就是快照读,快照读,读取的是记录数据的可见版本,有可能是历史数据,不加锁,是非阻塞读。
🐬Read Committed:每次select,都生成一个快照读。
🐬Repeatable Read:开启事务后第一个select语句才是快照读的地方。
🐬Serializable:快照读会退化为当前读。
MVCC(Multi-Version Concurrency Control)
- 多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突,快照读为MySQL实现
- MVCC提供了一个非阻塞读功能。MVCC的具体实现,还需要依赖于数据库记录中的
三个隐式字段、undo log日志、readView。

2.4.1 隐藏字段

当你建立一个表的时候,会正常的给你三个字段,但是他还会生成隐藏的三个分别是上面灰色的部分:DB_TRX_ID, DB_ROLL_PTR, DB_ROW_ID。
| 隐藏字段 | 含义 |
|---|---|
| DB_TRX_ID | 最近修改事务ID,记录插入这条记录或最后一次修改该 记录的事务ID。 |
| DB_ROLL_PTR | 回滚指针,指向这条记录的上一个版本,用于配合undo log,指向上一个版本。 |
| DB_ROW_ID | 隐藏主键,如果表结构没有指定主键,将会生成该隐藏字段。 |

2.4.2 undo log版本链
undo log
- 回滚日志,在insert、 update、 delete的时候产生的便于数据回滚的日志。
- 当insert的时候,产生的undo log日志只在回滚时需要,在事务提交后,可被立即删除。
- 而update、delete的时候,产生的undo log日志不仅在回滚时需要,在快照读时也需要,不会立即被删除。




不同事务或相同事务对同一条记录进行修改,会导致该记录的undolog生成一条记录版本链表,链表的头部是最新的旧记录,链表尾部是最早的旧记录。

2.4.3 readview介绍
ReadView (读视图)是快照读SQL执行时MVCC提取数据的依据,记录并维护系统当前活跃的事务(未提交的) id。
ReadView中包含了四个核心字段:
| 字段 | 含义 |
|---|---|
| m_ids | 当前活跃的事务ID集合 |
| min_trx_id | 最小活跃事务ID |
| max_trx_id | 预分配事务ID,当前最大事务ID+1 (因为事务ID是自增的) |
| creator_trx_id | ReadView创建者的事务ID |
readview
trx_ id: 代表是当前事务ID。

不同的隔离级别,生成ReadView的时机不同:
➢READ COMMITTED :在事务中每一次执行快照读时生成ReadView。
➢REPEATABLE READ:仅在事务中第一次执行快照读时生成ReadView, 后续复用该ReadView。

2.4.4 原理分析RC级别
RC隔离级别下,在事务中每一次执行快照读时生成ReadView。




2.4.5 原理分析RR级别
RR隔离级别下,仅在事务中第一次执行快照读时生 成ReadView,后续复用该ReadView。



=====================================================
3. MySQL管理(了解)
3.1 MySQL管理-系统数据库介绍

数据库自带的。
| 数据库 | 含义 |
|---|---|
| mysql | 存储MySQL服务器正常运行所需要的各种信息(时区、 主从、用户、权限等) |
| information_schema | 提供了访问数据库元数据的各种表和视图,包含数据库、表、字段类型及访问权限等 |
| performance_schema | 为MySQL服务器运行时状态提供了一一个底层监控功能,主要用于收集数据库服务器性能参数 |
| sys | 包含了一系列方便DBA和开发人员利用performance_ schema 性能数据库进行性能调优和诊断的视图 |

3.2 MySQL管理-常用工具
3.2.1 mysql
该mysql不是指mysql服务,而是指mysql的客户端的工具。
语法
mysql [options] [database]
选项
-u, --user=name #指定用户名
-p, --password[=name] #指定密码
-h, --host=name #指定服务器IP或域名
-P, --port=port #指定连接端口
-e, --execute=name #执行SQL语句并退出
-e选项可以在Mysq|客户端执行SQL语句,而不用连接到MySQL数据库再执行,对于一些批处理脚本,这种方式尤其方便。
示例:
mysql -uroot -p123456 db01 -e "select * from stu";

3.2.2 mysqladmin
mysqladmin是一个执行管理操作的客户端程序。可以用它来检查服务器的配置和当前状态、创建并删除数据库等。
通过帮助文档查看选项:mysqladmin --help
示例:
mysqladmin -uroot -p123456 drop 'test01';
mysqladmin -uroot -p123456 version;

3.2.3 mysqlbinlog
由于服务器生成的二进制日志文件以二进制格式保存,所以如果想要检查这些文本的文本格式,就会使用到mysqlbinlog日志管理工具。
语法
mysqlbinlog [options] log-files1 log-files2 ...
选项
-d, --database=name 指定数据库名称,只列出指定的数据库相关操作。
-o, --offset=# 忽略掉日志中的前n行命令。
-r,--result-file=name 将输出的文本格式日志输出到指定文件。
-s, --short-form 显示简单格式,省略掉一 些信息。
--start-datatime=date1 --stop-datetime=date2 指定日期间隔内的所有日志。
--start-position=pos1 --stop-position=pos2 指定位置间隔内的所有日志。

3.2.4 mysqlshow
mysqlshow客户端对象查找工具,用来很快地查找存在哪些数据库、数据库中的表、表中的列或者索引
语法
mysqlshow [options] [db_name [table_name [col_namel]]
选项
--count 显示数据库及表的统计信息(数据库,表均可以不指定)
-i 显示指定数据库或者指定表的状态信息
示例
#查询每个数据库的表的数量及表中记录的数量
mysqlshow -uroot -p2143 --count#查询test库中每个表中的字段书,及行数
mysqlshow -uroot -p2143 test --count#查询test库中book表的详细情况
mysqlshow -uroot -p2143 test book --count
C:\Users\HP>mysqlshow -uroot -p123456 --count
mysqlshow: [Warning] Using a password on the command line interface can be insecure.
+--------------------+--------+--------------+
| Databases | Tables | Total Rows |
+--------------------+--------+--------------+
| information_schema | 79 | 28446 |
| mybatis | 1 | 6 |
| mysql | 38 | 4146 |
| performance_schema | 111 | 318915 |
| sakila | 23 | 50081 |
| sys | 101 | 6535 |
| test | 11 | 58 |
| tlias | 2 | 22 |
| world | 3 | 5302 |
+--------------------+--------+--------------+
9 rows in set.
C:\Users\HP>mysqlshow -uroot -p123456 test --count
mysqlshow: [Warning] Using a password on the command line interface can be insecure.
Database: test
+----------------+----------+------------+
| Tables | Columns | Total Rows |
+----------------+----------+------------+
| account | 3 | 2 |
| course | 2 | 4 |
| dept | 2 | 5 |
| emp | 8 | 15 |
| emp2 | 8 | 6 |
| stu | 3 | 7 |
| student | 3 | 3 |
| student_course | 3 | 4 |
| tb_user | 5 | 4 |
| tb_user_edu | 7 | 4 |
| user | 5 | 4 |
+----------------+----------+------------+
11 rows in set.C:\Users\HP>
C:\Users\HP>mysqlshow -uroot -p123456 test stu --count
mysqlshow: [Warning] Using a password on the command line interface can be insecure.
Database: test Table: stu Rows: 7
+-------+--------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
| Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment |
+-------+--------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
| id | int | | NO | PRI | | auto_increment | select,insert,update,references | |
| age | int | | NO | MUL | | | select,insert,update,references | |
| name | varchar(255) | utf8mb4_general_ci | YES | | | | select,insert,update,references | |
+-------+--------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+C:\Users\HP>
Database: test Wildcard: stu
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+--------------------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+--------------------+----------+----------------+---------+
| stu | InnoDB | 10 | Dynamic | 7 | 2340 | 16384 | 0 | 16384 | 0 | 26| 2023-10-03 16:13:32 | 2023-10-05 16:19:09 | | utf8mb4_0900_ai_ci | | | |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+--------------------+----------+----------------+---------+C:\Users\HP>

3.2.5 mysqldump
mysqldump客户端工具用来备份数据库或在不同数据库之间进行数据迁移。备份内容包含创建表,及插入表的sQL语句。
语法
mysqldump [options] db_name [tables]
mysqldump [options] --database/ -B db1 [db2 db3...]
mysqldump [options] -all-databases/-A
连接选项
-u, --user=name 指定用户名
-p, --password[=name] 指定密码
-h, --host=name 指定服务器ip或域名
-P, --port=# 指定连接端口
输出选项
--add-drop-database 在每个数据库创建语句前加上drop database语句
--add-drop-table 在每个表创建语句前加上droptable语句,默认开启;不开启(--skip-add-drop-table)
-n, --no-create-db 不包含数据库的创建语句
-t, --no-create-info 不包含数据表的创建语句
-d --no-data 不包含数据
-T, --tab=name 自动生成两个文件:一个.sql文件,创建表结构的语句;一个.txt文件,数据文件

3.2.6 mysqlimport/source
mysqlimport是客户端数据导入工具,用来导入mysqldump加-T参数后导出的文本文件。
语法
mysqlimport [options] db_ name textfile1 [tetile...].
示例
mysqlimport -uroot -p2143 test /tmp/city.txt
- 如果需要导入sq|文件,可以使用mysqI中的source指令
- 语法
source /root/xxxx.sql

- 语法

3.3 MySQL管理-小结


相关文章:
MySQL数据库入门到精通——进阶篇(3)
黑马程序员 MySQL数据库入门到精通——进阶篇(3) 1. 锁1.1 锁-介绍1.2 锁-全局锁1.3 锁-表级锁1.3.1 表级锁-表锁1.3.2 表级锁元数据锁( meta data lock,MDL)1.3.3 表级锁-意向锁1.3.4 表级锁意向锁测试 1.4 锁-行级锁1.4.1 行级锁-行锁1.4.2…...
Mind Map:大语言模型中的知识图谱提示激发思维图10.1+10.2
知识图谱提示激发思维图 摘要介绍相关工作方法第一步:证据图挖掘第二步:证据图聚合第三步:LLM Mind Map推理 实验实验设置医学问答长对话问题使用KG的部分知识生成深入分析 总结 摘要 LLM通常在吸收新知识的能力、generation of hallucinati…...
[引擎开发] 杂谈ue4中的Vulkan
接触Vulkan大概也有大半年,概述一下自己这段时间了解到的东西。本文实际上是杂谈性质而非综述性质,带有严重的主观认知,因此并没有那么严谨。 使用Vulkan会带来什么呢?简单来说就是对底层更好的控制。这意味着我们能够有更多的手段…...
docker--redis容器部署及地理空间API的使用示例-II
文章目录 Redis 地理位置类型API命令操作示例JAVA使用示例导入依赖RedisTemplate 操作GeoData示例CityInfo实体类Geo操作接口类Geo操作接口实现类SpringBoot测试类RedissonClient 操作GeoData示例docker–redis容器部署及与SpringBoot整合 docker–redis容器部署及地理空间API的…...
Vue中如何进行文件浏览与文件管理
Vue中的文件浏览与文件管理 文件浏览与文件管理是许多Web应用程序中常见的功能之一。在Vue.js中,您可以轻松地实现文件浏览和管理功能,使您的应用程序更具交互性和可用性。本文将向您展示如何使用Vue.js构建文件浏览器和文件管理功能,以及如…...
jenkins利用插件Active Choices Plug-in达到联动显示或隐藏参数,且参数值可修改
1. 添加组件 Active Choices Plug-in 如jenkins无法联网,可在以下两个地址中下载插件,然后放到/home/jenkins/.jenkins/plugin下面重启jenkins即可 Active Choices Active Choices | Jenkins plugin 2. 效果如下: sharding为空时…...
香蕉叶病害数据集
1.数据集 第一个文件夹为数据增强(旋转平移裁剪等操作)后的数据集 第二个文件夹为原始数据集 2.原始数据集 Cordana文件夹(162张照片) healthy文件夹(129张) Pestalotiopsis文件夹(173张照片&…...
天地无用 - 修改朋友圈的定位: 高德地图 + 爱思助手
1,电脑上打开高德地图网页版 高德地图 (amap.com) 2,网页最下一栏,点击“开放平台” 高德开放平台 | 高德地图API (amap.com) 3,在新网页中,需要登录高德账户才能操作。 可以使用手机号和验证码登录。 4,…...
AtCoder Beginner Contest 232(A-G)
A - QQ solver (atcoder.jp)直接按题意模拟即可。 B - Caesar Cipher (atcoder.jp)按题意模拟即可 C - Graph Isomorphism (atcoder.jp)按题意模拟即可 D - Weak Takahashi (atcoder.jp) 一个非常套路的网格dp E - Rook Path (atcoder.jp) (1)题意 有…...
计算机网络(第8版)-第5章 运输层
5.1 运输层协议概述 5.1.1 进程之间的通信 图5-1 中两个运输层之间有一个深色双向粗箭头,写明“运输层提供应用进程间的逻辑通信”。 图5-1 运输层为相互通信的应用进程提供了逻辑通信 5.1.2 运输层的两个主要协议 5.1.3 运输层的端口 请注意,这种…...
AtCoder Beginner Contest 231(D-F,H)
D - Neighbors (atcoder.jp) (1)题意 给出M组关系,问是否有一个排列,能表示A[i]和B[i]相邻 (2)思路 考虑如果有环,显然不能满足排列,因为排列中度数最多为2,若有超过2的显…...
【Python】map
map()函数是Python内置函数之一,它的主要作用是将一个函数应用于可迭代对象中的每个元素,并返回一个包含结果的迭代器。 map()函数的语法如下: map(function, iterable)function参数是一个函数,表示要应用于可迭代对象每个元素的…...
Swift 5.9 与 SwiftUI 5.0 中新 Observation 框架应用之深入浅出
0. 概览 Swift 5.9 一声炮响为我们带来全新的宏(Macro)机制,也同时带来了干霄凌云的 Observation 框架。 Observation 框架可以增强通用场景下的使用,也可以搭配 SwiftUI 5.0 而获得双剑合璧的更强威力。 在本篇博文,…...
【已解决】在 Vite 项目中使用 eslint-config-ali 时遇到的解析错误
错误还原 搭建 Vite 项目 pnpm create vite my-vue-app --template vue-ts安装 eslint-config-ali pnpm i -D eslint-config-ali typescript-eslint/parser typescript-eslint/eslint-plugin eslint-plugin-import eslint-import-resolver-typescript vue-eslint-parser esl…...
蓝桥杯每日一题2023.10.5
3420. 括号序列 - AcWing题库 题目描述 题目分析 对于这一我们需要有前缀知识完全背包 完全背包的朴素写法: #include<bits/stdc.h> using namespace std; const int N 1010; int n, m, v[N], w[N], f[N][N]; int main() {cin >> n >> m;fo…...
PyTorch实例:简单线性回归的训练和反向传播解析
文章目录 🥦引言🥦什么是反向传播?🥦反向传播的实现(代码)🥦反向传播在深度学习中的应用🥦链式求导法则🥦总结 🥦引言 在神经网络中,反向传播算法…...
Arcgis提取玉米种植地分布,并以此为掩膜提取遥感影像
Arcgis提取玉米种植地分布上,并以此为掩膜提取遥感影像 一、问题描述 因为之前反演是整个研究区,然而土地利用类型有很多类,只在农田或者植被上进行反演,需要去除水体、建筑等其他类型,如何处理得到下图中只有耕地类…...
软件工程与计算总结(四)项目管理基础
目录 一.项目和项目管理 二.团队组织与管理 三.软件质量保障 四.软件配置管理 五.项目实践 一.项目和项目管理 1.软件开发远不是纯粹的编程,随着软件规模的增长,软件开发活动也变得越来越复杂~ 2.软件项目就是要将所有的软件开发活动组织起来&#…...
【Python】datetime 库
# timedelta(days, seconds, microseconds,milliseconds, minutes, hours, weeks) 默认按顺序传递参数 # 主要介绍 datetime.datetime 类 # 引入 from datetime import datetime today datetime.now() # 获取当前时间 2023-10-05 15:58:03.218651 today1 datetime.utcnow() #…...
从0开始python学习-28.selenium 需要图片验证的登录
url https://test.com/login driver.get(url) # 获取登录页面需要输入账号密码进行模拟登录操作 user driver.find_element(By.XPATH,//*[id"login"]/div[2]/div/form[2]/div[2]/div/div/input).send_keys(username) pwd driver.find_element(By.XPATH,//*[id&qu…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
