史上最常用sql字典(纯语法,无其他案例,方便查阅,原文我放在了博客最后)

史上最常用sql字典,纯语法,无案例,方便查阅

一、基础操作

  • 查询所有数据库

    show databases ;  --mysql数据库
    
    \l  --opengauss数据库
    
  • 查询当前数据库

    select database() ;
    
  • 创建数据库(可以指定用户名)

    create database [ if not exists ] 数据库名 [ default charset 字符集 ] [ collate 排序规则 ] [owner 用户名];
    
  • 创建模式(在mysql中好像没有模式的概念,该语法是opengauss的语法)

    create schema 模式名 authorization 用户名;
    
  • 查看某数据库中的所有模式

    \dn   --opengauss数据库
    
  • 删除数据库

    drop database [ if exists ] 数据库名 ;
    
  • 切换数据库

    use 数据库名 ;
    
    \c 数据库名    --opengauss数据库
    
  • 数据库重新命名

    alter database 旧数据库名 rename to 新数据库名;
    
  • 查询当前数据库所有表

    show tables;
    
  • 分析一条SQL查询语句的执行计划

    EXPLAIN + 查询语句
    

​ EXPLAIN中各个字段的含义:(378条消息) sql性能分析之explain详解_sql的explain_不慕的博客-优快云博客

二、DDL

2.1、创建表

  • 创建表结构

    CREATE TABLE 表名( 
    
    字段1 字段1类型 [ COMMENT 字段1注释 ], 
    
    字段2 字段2类型 [COMMENT 字段2注释 ], 
    
    字段3 字段3类型 [COMMENT 字段3注释 ], 
    
    ...... 
    
    字段n 字段n类型 [COMMENT 字段n注释 ] 
    
    ) [ COMMENT 表注释 ] ;
    

2.2、修改表

  • 添加字段

    ALTER TABLE 表名 ADD 字段名 类型 (长度) [ COMMENT 注释 ] [ 约束 ];
    
  • 修改数据类型

    ALTER TABLE 表名 MODIFY 字段名 新数据类型 (长度);
    
  • 修改字段名和字段类型

    ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型 (长度) [ COMMENT 注释 ] [ 约束 ];
    
  • 删除字段

    ALTER TABLE 表名 DROP 字段名;
    
  • 修改表名

    ALTER TABLE 表名 RENAME TO 新表名; 
    
  • 删除表

    DROP TABLE [ IF EXISTS ] 表名; 
    

三、DML

  • 给指定字段添加数据

    INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...); 
    
  • 给全部字段添加数据

    INSERT INTO 表名 VALUES (值1, 值2, ...); 
    
  • 批量添加数据

    INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...), (值1, 值2, ...), (值 
    1, 值2, ...) ; 
    
    INSERT INTO 表名 VALUES (值1, 值2, ...), (值1, 值2, ...), (值1, 值2, ...) ;
    
  • 修改数据

    UPDATE 表名 SET 字段名1 = 值1 , 字段名2 = 值2 , .... [ WHERE 条件 ] ; 
    
  • 删除数据

    DELETE FROM 表名 [ WHERE 条件 ] ; 
    

四、DQL(单表查询)

  • 查询语句(总览)

    SELECT
    
    ​			字段列表 
    
    FROM
    
    ​			表名列表 
    
    WHERE
    
    ​			条件列表 
    
    GROUP BY 
    
    ​			分组字段列表 
    
    HAVING
    
    ​			分组后条件列表 
    
    ORDER BY 
    
    ​			排序字段列表 
    
    LIMIT
    
    ​			分页参数 
    

4.1基础查询

  • 查询多个字段

    SELECT 字段1, 字段2, 字段3 ... FROM 表名
    SELECT * FROM 表名
    
  • 字段设置别名

    SELECT 字段1 [ AS 别名1 ] , 字段2 [ AS 别名2 ] ... FROM 表名;
    SELECT 字段1 [ 别名1 ] , 字段2 [ 别名2 ] ... FROM 表名;
    
  • 去除重复记录

    SELECT DISTINCT 字段列表 FROM 表名;
    

4.2、条件查询

  • SELECT 字段列表 FROM 表名 WHERE 条件列表 ;
    
    比较运算符功能
    >大于
    >=大于等于
    <小于
    <=小于等于
    =等于
    <> 或 !=不等于
    BETWEEN … AND …在某个范围之内(含最小、最大值)
    IN(…)在in之后的列表中的值,多选一
    LIKE 占位符模糊匹配(_匹配单个字符, %匹配任意个字符,[ ]匹配中括号中的其中一个字符)
    IS NULL是NULL

4.3、聚合查询

SELECT 聚合函数(字段列表) FROM 表名 ;
聚合函数功能
count统计数量
max最大值
min最小值
avg平均值
sum求和

4.4、分组查询

SELECT 字段列表/聚合函数 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组 
后过滤条件 ];

4.5、排序查询

SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1 , 字段2 排序方式2 ;

4.6、分页查询

SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数 ;

五、DCL

5.1、查询所有用户及其权限

  • select * from mysql.user; 
    
    \du  --opengauss数据库
    

5.2、创建用户

CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';   --方式一

create user 用户名 with password "密码";  --方式二

create user 用户名 password "******";

5.3、修改用户密码

ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码' ; 

5.4、删除用户

  • DROP USER '用户名'@'主机名' ; 
    
    drop user 用户名 cascade;
    

5.5、查询某个用户的权限

SHOW GRANTS FOR '用户名'@'主机名' ; 

5.6、授予权限

GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名'; 

给用户授权对某数据库的所有权限
grant all privileges on database 数据库名 to 用户名;
为用户追加有创建角色的CREATEROLE权限
alter user 用户名 createrole;
将sysadmin权限授权给用户
grant all privileges to 用户名;

5.7、撤销权限

REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名'; 

5.8、切换用户

\c - 用户名    --opengauss数据库


六、完整性约束

6.1、一般约束

约束语法
非空约束NOT NULL
唯一约束UNIQUE
主键约束PRIMARY KEY
默认约束DEFAULT
检查约束CHECK
外键约束FOREIGN KEY

6.2、外键约束(FOREIGN KEY)

  • 建表时添加外键
CREATE TABLE 表名( 

字段名 数据类型  [CONSTRAINT] [外键名称] REFERENCES 主表 (主表列名),   -- 方式1

... 

[CONSTRAINT] [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名)   -- 方式2

);
  • 后期添加外键

    ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) 
    REFERENCES 主表 (主表列名) ; 
    
  • 删除外键

    ALTER TABLE 表名 DROP FOREIGN KEY 外键名称; 
    
  • 外键在删除/更新时的行为

    行为说明
    NO ACTION当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。 (与 RESTRICT 一致) 默认行为
    RESTRICT当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。 (与 NO ACTION 一致) 默认行为
    CASCADE当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录。
    SET NULL当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(这就要求该外键允许取null)。
    SET DEFAULT父表有变更时,子表将外键列设置成一个默认的值 (Innodb不支持)

    具体语法为:

    ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES 
    
    主表名 (主表字段名) [ON UPDATE 行为] [ON DELETE 行为];
    

6.3、检查约束(用户自定义)(CHECK)

  • 建表时
CREATE TABLE 表名( 

字段名 字段类型 [CONSTRAINT] [检查约束名] check( ... ), -- 方式1

...

[CONSTRAINT] [检查约束名] check( ... ),  -- 方式2

);

  • 后期添加
ALTER TABLE 表名 ADD CONSTRAINT 约束名称 check(...);

6.4、主键约束(PRIMARY KEY)

  • 建表时
CREATE TABLE 表名( 

字段名 字段类型 [CONSTRAINT] [主键名称] primary key, -- 方式1

...

[CONSTRAINT] [主键名称] primary key(字段1,字段2 ... ),  -- 方式2

);

(注:主键可以由多个字段共同组成)
  • 后期添加
ALTER TABLE 表名 ADD CONSTRAINT 主键名称 primary key(字段1,字段2 ... );

七、多表查询

7.1、内连接

  • 隐式内连接

    SELECT 字段列表 FROM 表1 , 表2 WHERE 条件 ... ;
    
  • 显式内连接

    SELECT 字段列表 FROM 表1 [ INNER ] JOIN 表2 ON 连接条件 ... ;
    

    7.2、外连接

  • 左外连接

    SELECT 字段列表 FROM 表1 LEFT [ OUTER ] JOIN 表2 ON 条件 ... ;
    
  • 右外连接(一般转换为左外链接)

    SELECT 字段列表 FROM 表1 RIGHT [ OUTER ] JOIN 表2 ON 条件 ... ;
    

    7.3、自链接

    SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件 ... ;  
    (注:自链接中必须要为表起别名)
    

    7.4、联合查询

  • 不去重(union all)

    SELECT 字段列表 FROM 表A ... 
    UNION [ ALL ] 
    SELECT 字段列表 FROM 表B ....;
    
    (加上ALL不会进行去重)
    

7.5、子查询(嵌套查询)

  • 带有比较运算符的子查询
SELECT * FROM t1 WHERE column1 [ = > < >= <= <> ...] ( SELECT column1 FROM t2 );

(注:内层查询返回值必须为单个值!!!)
  • 带有IN谓词的子查询
SELECT * FROM t1 WHERE column1 IN ( SELECT column1 FROM t2 );

(注:内层查询返回值可以为一列)
  • 带有ANY(SOME)或ALL谓词的子查询
SELECT * FROM t1 WHERE column1 比较运算符 ANY/ALL ( SELECT column1 FROM t2 );

(注:内层查询返回值可以为一列)
  • 带有EXISTS谓词的子查询

    (带有EXISTS的内层查询值返回true或false)

SELECT * FROM t1 WHERE EXISTS ( SELECT column1 FROM t2 );

八、事务

8.1、查看/设置事务提交方式

SELECT @@autocommit ; 

SET @@autocommit = 0 ;   -- 设置为手动提交

8.2、提交事务

COMMIT;

8.3、回滚事务

ROLLBACK;

8.4、开启事务

START TRANSACTION 或 BEGIN ;

8.5、事务的四大特性

原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

8.6、并发事务问题

问题描述
脏读同一个事务中,读到另外一个事务还没有提交的数据。
不可重复读同一个事务中,先后读取同一条记录,但两次读取的数据不同(读到另外一个事务已经提交的数据),称之为不可重复读。
幻读一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了"幻影"。
丢失修改(脏写)两个事务T1和T2读入同一数据并修改,T2提交的结果破坏了T1提交的结果,导致T1的修改被丢失

​ 严重性:脏写>脏读>不可重复读>幻读

8.7、事务隔离级别

隔离级别脏读不可重复读幻读
Read uncommitted
Read committed×
Repeatable Read(mysql默认)××
Serializable×××
  • 查看事务隔离级别

    SELECT @@TRANSACTION_ISOLATION;
    
  • 设置事务隔离级别

    SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }
    

8.8、事务与日志、锁的关系

  • 事务的持久性由REDO日志来体现
  • 事务的原子性和一致性由UNDO日志来体现
  • 事务的隔离性由 锁机制 和 MVCC 来体现

九、索引

  • 作用:优化存取路径,提高查询效率

  • 分类

分类含义特点关键字
主键索引针对于表中主键创建的索引默认自动创建, 只能有一个PRIMARY
唯一索引避免同一个表中某数据列中的值重复可以有多个UNIQUE
常规索引快速定位特定数据可以有多个
全文索引全文索引查找的是文本中的关键词,而不是比较索引中的值可以有多个FULLTEXT

聚集索引和二级索引

分类含义特点
聚集索引(Clustered Index)将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据必须有,而且只有一个
二级索引(Secondary Index)或辅助索引将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键可以存在多个
  • 创建索引
CREATE [UNIQUE][fulltext] INDEX <索引名> ON <表名> 
(<列名>[次序], <列名>[次序])

(注:在有些数据库中,聚集索引不能使用create cluster...来创建,mysql好像不支持聚集索引,opengauss创建聚集索引语法为:  cluster <索引名> on 表名(<列名>[次序]); )
  • 查看索引
SHOW INDEX FROM 表名 ;
  • 删除索引
DROP INDEX <索引名> ON 表名 ;

DROP INDEX 表名.<索引名> [on 表名];   (有些数据库(如opengauss)不支持加上[on 表名])
  • 修改索引名
ALTER INDEX index_name RENAME TO new_index_name; -- 修改索引名称

ALTER INDEX index_name RENAME COLUMN column_name TO new_column_name; -- 修改索引列名称

十、视图

  • 作用:1、简化用户操作,2、对重构数据库提供了一定程度的逻辑独立性,3、对机密数据提供安全保护

  • 创建

CREATE [OR REPLACE] VIEW 视图名称[(列名列表)]   AS SELECT语句 [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]
(注:创建视图时既可以根据表也可以根据其他视图)
  • 查询
查看创建视图语句:SHOW CREATE VIEW 视图名称; 
查看视图数据:SELECT * FROM 视图名称 ...... ;
  • 修改
方式一:CREATE [OR REPLACE] VIEW 视图名称[(列名列表)] AS SELECT语句 [ WITH [ CASCADED | LOCAL ] CHECK OPTION ] 
方式二:ALTER VIEW 视图名称[(列名列表)] AS SELECT语句 [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]
  • 删除
DROP VIEW [IF EXISTS] 视图名称 [,视图名称] ...
  • 检查选项
WITH [CASCADED/LOCAL] CHECK OPTION

(注:在进行插入数据操作时,CASCADED会强制检查其所依赖的视图是否满足条件,
	LOCAL先判断其所依赖的视图在创建时后面是否有检查选项,然后在判断时将插入的数据是否满足条件)
  • 插入数据
INSERT INTO 视图名称 VALUES(字段列表 )

(视图必须为可更新视图)

十一、存储过程

  • 创建
CREATE PROCEDURE 存储过程名称 ([ 参数列表 ]) 
BEGIN
	-- SQL语句 
END ;
  • 调用
CALL 名称 ([ 参数 ]);
  • 查看
SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = 'xxx'; -- 查询指 定数据库的存储过程及状态信息 
SHOW CREATE PROCEDURE 存储过程名称 ; -- 查询某个存储过程的定义
  • 删除
DROP PROCEDURE [ IF EXISTS ] 存储过程名称 ;

11.1、参数

类型含义备注
IN该类参数作为输入,也就是需要调用时传入值默认
OUT该类参数作为输出,也就是该参数可以作为返回值
INOUT既可以作为输入参数,也可以作为输出参数

11.2、变量

11.1.1 查看系统变量(分为全局和会话)
SHOW [ SESSION | GLOBAL ] VARIABLES ; -- 查看所有系统变量 

SHOW [ SESSION | GLOBAL ] VARIABLES LIKE '......'; -- 可以通过LIKE模糊匹配方 式查找变量 

SELECT @@[SESSION | GLOBAL].系统变量名; -- 查看指定变量的值
11.1.2 设置系统变量
SET [ SESSION | GLOBAL ] 系统变量名 = 值 ; 
SET @@[SESSION | GLOBAL]系统变量名 = 值 ;
注意:
如果没有指定SESSION/GLOBAL,默认是SESSION,会话变量。(mysql服务重新启动之后,所设置的全局参数会失效,要想不失效,可以在 /etc/my.cnf 中配置。)
A. 全局变量(GLOBAL): 全局变量针对于所有的会话。
B. 会话变量(SESSION): 会话变量针对于单个会话,在另外一个会话窗口就不生效了。
11.1.3 用户自定义变量

​ 用户定义变量 是用户根据需要自己定义的变量,用户变量不用提前声明,在用的时候直接用 "@变量

名" 使用就可以。其作用域为当前连接。

1)赋值

方式一:
SET @var_name = expr [, @var_name = expr] ... ; 
SET @var_name := expr [, @var_name := expr] ... ;

方式二:
SELECT @var_name := expr [, @var_name := expr] ... ; 
SELECT 字段名 INTO @var_name FROM 表名;

2)使用

SELECT @var_name ;
11.1.4、局部变量

​ 局部变量 是根据需要定义的在局部生效的变量,访问之前,需要DECLARE声明。可用作存储过程内的

局部变量和输入参数,局部变量的范围是在其内声明的BEGIN … END块。

1)声明

DECLARE 变量名 变量类型 [DEFAULT ... ] ;

2)赋值

SET 变量名 = 值 ; 
SET 变量名 := 值 ; 
SELECT 字段名 INTO 变量名 FROM 表名 ... ;

11.3、if条件判断

IF 条件1 THEN 
	..... 
ELSEIF 条件2 THEN -- 可选 
	..... 
ELSE -- 可选 
	..... 
END IF;

十二、函数

12.1、字符串函数

函数功能
CONCAT(S1,S2,…Sn)字符串拼接,将S1,S2,… Sn拼接成一个字符串
LOWER(str)将字符串str全部转为小写
UPPER(str)将字符串str全部转为大写
LPAD(str,n,pad)左填充,用字符串pad对str的左边进行填充,达到n个字符串长度
RPAD(str,n,pad)右填充,用字符串pad对str的右边进行填充,达到n个字符串长度
TRIM(str)去掉字符串头部和尾部的空格
SUBSTRING(str,start,len)返回从字符串str从start位置起的len个长度的字符串

12.2、数值函数

函数功能
CEIL(x)向上取整
FLOOR(x)向下取整
MOD(x,y)返回x/y的模
RAND()返回0~1内的随机数
ROUND(x,y)求参数x的四舍五入的值,保留y位小数

12.3、日期函数

函数功能
CURDATE()返回当前日期
CURTIME()返回当前时间
NOW()返回当前日期和时间
YEAR(date)获取指定date的年份
MONTH(date)获取指定date的月份
DAY(date)获取指定date的日期
DATE_ADD(date, INTERVAL expr type)返回一个日期/时间值加上一个时间间隔expr后的时间值
DATEDIFF(date1,date2)返回起始时间date1 和 结束时间date2之间的天数

12.4、流程函数

12.5、用户自定义函数(存储函数)

  • 创建
CREATE FUNCTION函数名(参数名	参数类型,···)
RETURNS 返回值类型
[characteristics ...]
BEGIN
	函数体	--函数体中肯定有 RETURN 语句
END

(注:function中默认是in类型的参数)
  • 调用
SELECT 函数名(实参列表)

13、触发器

​ 在mysql中只支持行级触发器,不支持语句级触发器

触发器类型NEW OLD
INSERT 型触发器NEW 表示将要或者已经新增的数据
UPDATE 型触发器OLD 表示修改之前的数据 , NEW 表示将要或已经修改后的数据
DELETE 型触发器OLD 表示将要或者已经删除的数据
  • 13.1、创建触发器方式一
CREATE TRIGGER 触发器名 
BEFORE/AFTER INSERT/UPDATE/DELETE 
ON 表名 FOR EACH ROW -- 行级触发器 
BEGIN
	trigger_stmt ; 
END;
  • 创建触发器方式二

    CREATE TRIGGER 触发器名 
    BEFORE/AFTER INSERT/UPDATE/DELETE 
    ON 表名 FOR EACH ROW -- 行级触发器 
    EXECUTE PROCEDURE/FUNCTION  函数名/存储过程名;
    
  • 13.2、查看触发器

SHOW TRIGGERS ;
  • 13.3、删除
DROP TRIGGER [schema_name.]trigger_name ;   -- 如果没有指定 schema_name,默认为当前数 据库 。

14、锁

14.1、锁的分类

  • 写锁排他锁又称为写锁。若事务T对数据对象A加上写锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁为止。这就保证了其他事务在T释放A上的锁之前不能再读取和修改A(既不能读也不能写)
  • 读锁共享锁又称为读锁。若事务T对数据对象A加上读锁,则事务T可以读A但不能修改A,其他事务只能再对A加读锁,而不能加X锁,直到T释放A上的读锁为止。这就保证了其他事务可以读A,但在T释放A上的读锁之前不能对A做任何修改
    • 读锁和写锁的兼容性问题:读锁和读锁之间可以兼容, 读锁和写锁、写锁和写锁之间不能兼容。
  • 活锁:某一个事务/进程因为一直获取不到锁而进入无限等待的状态。
  • 死锁:两个或多个事务/进程无限期地相互等待资源,从而导致所有事务/进程都无法继续执行的情况。(活锁和死锁是两种异常状态,解决办法详见操作系统)
  • 乐观锁:对数据进行操作时,先不加锁,而是在提交操作时再检查数据是否被其他事务修改过。加锁的方式是版本控制机制,常用于更新操作。并发性较高。
  • 悲观锁

14.3、如何选择锁的粒度(见《数据库系统概论第五版》p321)

  • 需要处理某个关系的大量元组的事务可以以关系为封锁粒度(表级锁)
  • 需要处理多个关系的大量元组的事务可以以数据库为封锁粒度(全局锁)
  • 只需要处理少量元组的用户事务,以元组为封锁粒度比较合适(行级锁)

14.2、全局锁

  • 加全局锁

    flush tables with read lock;
    
  • 释放锁

    unlock tables;
    
  • 缺点:1.如果在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆。2.如果在从库上备份,那么在备份期间从库不能执行主库同步过来的二进制日志(binlog),会导致主从延迟。

14.3、表锁

  • 加表读锁

    lock tables 表名 read;
    
  • 加表写锁

    lock tables 表名 write;
    
  • 释放锁

    unlock tables;
    

14.4、元数据锁

  • MDL加锁过程是系统自动控制,无需显式使用,在访问一张表的时候会自动加.上。MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作。为了避免DML与DDL冲突,保证读写的正确性。

14.5、意向锁

  • 为了避免DML在执行时,加的行锁与表锁的冲突, 在InnoDB中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查。
  • 意向共享锁(IS) :由语句select … lock in share mode添加。与表锁共享锁(read)兼容,与表锁排它锁(write) 互斥。
  • 意向排他锁 (IX) :由insert、 update、delete、select … for update添加。与表锁共享锁(read)及排它锁(write) 都互斥。意向锁之间不会互斥。

14.6、行级锁

15、日志

15.1、错误日志

查看日志位置

show variables like '%log_error%'

15.2、二进制日志

二进制日志(BINLOG) 记录了所有的DDL (数据定义语言)语句和DML (数据操纵语言)语句,但不包括数据查询(SELECT、 SHOW)语句。

作用:①.灾难时的数据恢复;②. MySQL的主从复制。

查看日志位置

show variables like '%log_bin%'

15.3、REDO日志和UNDO日志

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

  • 回滚日志,用于记录数据被修改前的信息 , 作用包含两个 : 提供回滚(保证事务的原子性) 和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。

本文是我大二学数据库系统原理这门课时的心得,写了好久的,可能不是很全,各位可以使用百度网盘下载笔记后自行修改。
本文旨在帮助各位程序员减轻写sql的负担😊😊😊😊😊

文章链接 密码6666

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值