1. 程式人生 > 實用技巧 >效能測試必備知識(7)- 深入理解“CPU 使用率”

效能測試必備知識(7)- 深入理解“CPU 使用率”

MySql

操作資料庫

SHOW VARIABLES LIKE 'datadir';      # 檢視資料目錄

show create table students \G # 檢視sql語句

SHOW ENGINES;
SHOW VARIABLES LIKE 'default_storage_engine%';
SET default_storage_engine=< 儲存引擎名 >;

CREATE DATABASE [IF NOT EXISTS] <資料庫名>
[[DEFAULT] CHARACTER SET <字符集名>]
[[DEFAULT] COLLATE <校對規則名>];

ALTER DATABASE [資料庫名] {
[ DEFAULT ] CHARACTER SET <字符集名> |
[ DEFAULT ] COLLATE <校對規則名>}

DROP DATABASE [ IF EXISTS ] <資料庫名>;

ALTER TABLE <表名> ENGINE=<儲存引擎名>; # 設定表的引擎

# 當發現數據無效時回滾
SET sql_mode = 'STRICT_ALL_TABLES' ;
SET sql_mode = 'STRICT_TRANS_TABLES';

資料型別

  1. 整數

    • tinyint 1位元組

    • SMALLINT 2位元組

    • MEDIUMINT 3位元組

    • INT 4位元組

    • BIGINT 8位元組

  2. 浮點數

    • FLOAT 4位元組

    • DOUBLE 8位元組

  3. 定點數

    • DECIMAL(M, D), DEC 取值範圍與double相同,以字串形式存放

  4. 日期 時間

    型別名稱日期格式日期範圍儲存需求
    YEAR YYYY 1901 ~ 2155 1 個位元組
    TIME HH:MM:SS -838:59:59 ~ 838:59:59 3 個位元組
    DATE YYYY-MM-DD 1000-01-01 ~ 9999-12-3 3 個位元組
    DATETIME
    YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 8 個位元組
    TIMESTAMP YYYY-MM-DD HH:MM:SS 1980-01-01 00:00:01 UTC ~ 2040-01-19 03:14:07 UTC 4 個位元組
  5. 字串

    CHAR(M)固定長度非二進位制字串M 位元組,1<=M<=255
    VARCHAR(M) 變長非二進位制字串 L+1位元組,在此,L< = M和 1<=M<=255
    TINYTEXT 非常小的非二進位制字串 L+1位元組,在此,L<2^8
    TEXT 小的非二進位制字串 L+2位元組,在此,L<2^16
    MEDIUMTEXT 中等大小的非二進位制字串 L+3位元組,在此,L<2^24
    LONGTEXT 大的非二進位制字串 L+4位元組,在此,L<2^32
    ENUM 列舉型別,只能有一個列舉字串值 1或2個位元組,取決於列舉值的數目 (最大值為65535)
    SET 一個設定,字串物件可以有零個或 多個SET成員 1、2、3、4或8個位元組,取決於集合 成員的數量(最多64個成員)
  6. 二進位制

    型別名稱說明儲存需求
    BIT(M) 位欄位型別 大約 (M+7)/8 位元組
    BINARY(M) 固定長度二進位制字串 M 位元組
    VARBINARY (M) 可變長度二進位制字串 M+1 位元組
    TINYBLOB (M) 非常小的BLOB L+1 位元組,在此,L<2^8
    BLOB (M) 小 BLOB L+2 位元組,在此,L<2^16
    MEDIUMBLOB (M) 中等大小的BLOB L+3 位元組,在此,L<2^24
    LONGBLOB (M) 非常大的BLOB L+4 位元組,在此,L<2^32

SQL

# DDL 資料定義語言
create table students (
student_id int unsigned not null auto_increment,
name varchar(30) default 'nobody',
class_id int,
sex char(1),
birth date null,
primary key(student_id [, name]), # 這種方式可以設定多欄位主鍵
constraint students foreign key (class_id) references class(id)
# 外來鍵
) engine=innodb
default charset=gb2312
auto_increment=100; # 初始值為100

desc students;

# DML 資料操作語言
insert into students(student_id, name, sex, birth)
values (41408101, 'mysql教程', '1', '2020-7-27');

ALTER TABLE <表名>
ADD COLUMN <列名> <型別> [FIRST][AFTER <已存在表名>]# 沒有first則新增在末尾
CHANGE COLUMN <舊列名> <新列名> <新列型別>
ALTER COLUMN <列名> { SET DEFAULT <預設值> | DROP DEFAULT }
MODIFY COLUMN <列名> <型別>
DROP COLUMN <列名>
DROP FOREIGN KEY fk_tab1_tab2 # 刪除外關聯的表前先刪除外來鍵
RENAME TO <新表名>
CHARACTER SET <字符集名>
COLLATE <校對規則名>

DROP TABLE IF EXISTS table1, table2, ...

# DQL 資料查詢語言

# DCL 資料控制語言

約束

主鍵

# 設定聯合主鍵
create table user(
'id' int,
'name' varchar(20),
primary key(id, name)
);

# 新增主鍵約束
alter table tb_user
add primary key(id);

# 刪除主鍵約束
alter table tb_user
drop primary key;

外來鍵

[CONSTRAINT <外來鍵名>] FOREIGN KEY 欄位名 [,欄位名2,…]
REFERENCES <主表名> 主鍵列1 [,主鍵列2,…]

create table tb_user(
id int primary key,
class_id int,
class_name varchar(24),
constraint fk_user_class
foreign key(class_id, class_name)
references tb_class(id, name)
);

# 新增外來鍵
alter table tb_user
add constraint fk_user_class
foreign key(class_id)
references tb_class(id);

# 刪除外來鍵
alter table tb_user
drop foreign key fk_user_class;

唯一約束

與主鍵不同:

主鍵只能有一個,唯一約束可以有多個;

主鍵不允許為空,唯一約束允許一個值為空。

<欄位> <資料型別> unique

# 新增唯一約束
alter table tb_table
add constraint unique_name UNIQUE(name);

# 刪除唯一約束
alter table tb_table
drop index unique_name;

檢查約束

create table tb_table(
'salary' float,
check(salary>0 and salary<0)
);

# 新增檢查約束
alter table tb_table
add constraint check_id check(id>0);

# 刪除檢查約束
alter table tb_table
drop constraint check_id;

預設值

create table tb_table(
name char default 'none'
);
# 增加
alter table tb_table
change column name name varchar(20) default 'nil';
# 刪除
alter table tb_table
change column name name varchar(20) default NULL;

非空約束

create table tb_table(
name char not null
);
# 增加
alter table tb_table
change column name name char not null;
# 刪除
alter table tb_table
change column name name char null;

常用運算子

算數

  1. +

  2. -

  3. *

  4. /

邏輯

  1. NOT !

  2. AND &&

  3. OR ||

  4. XOR

比較運算子

運算子作用
= 等於
<=> 安全的等於
<> 或者 != 不等於
<= 小於等於
>= 大於等於
> 大於
IS NULL 或者 ISNULL 判斷一個值是否為空
IS NOT NULL 判斷一個值是否不為空
BETWEEN AND 判斷一個值是否落在兩個值之間

位運算子

運算子說明使用形式舉例
| 位或 a | b 5 | 8
& 位與 a & b 5 & 8
^ 位異或 a ^ b 5 ^ 8
~ 位取反 ~a ~5
<< 位左移 a << b 5 << 2,表示整數 5 按位左移 2 位
>> 位右移 a >> b 5 >> 2,表示整數 5 按位右移 2 位

操作表中資料

查詢

SELECT *|<欄位名>
FROM t_table1 as t1, t_table2 as t2
WHERE <表示式>
GROUP BY <欄位>
HAVING <expression>
ORDER BY <欄位> [ASC|DESC]
LIMIT num offset num / LIMIT offset_num, limit_num

# distinct 去重
select distinct name from user;
# 萬用字元,%匹配任意長度字串,_ 匹配單一字元。
select name from user where name (not) like 'T%' or 'a_'
# 範圍查詢
select name, age from users where age between 18 and 30;
# 空值查詢
select name from users where class is null;
# group by 單獨使用
select name, sex from users group by sex;
# group by 與 group_concat()
select sex, group_concat(name) from users group by sex;
# group by 與 聚合函式
select sex, count(sex) from users group by sex;
# group by 與 with rollup(統計記錄總量)
select sex, group_concat(name) from users group by sex with rollup;
# having 用於過濾分組
select group_concat(name), sex, height from tb_student
group by height
having avg(height) > 170;

# 交叉連線
select * from tb_table1 cross join tb_table2;
select * from tb_course as tb1, tb_students as tb2
where tb1.id = tb2.class_id;

# 內連線
# 通過關鍵字連線兩張表,沒有ON連線條件,inner join 與 cross join 等價
select s.name c.course_name
from tb_students s inner join tb_course c
on s.course_id = c.id

# 左連線
# 以左側為基表,當右側表無符合項時設定為null
select s.name, c.course_name
from tb_students s left join tb_course c
on s.course_id=c.id
# 右連線,與左連線相反

# 子查詢
select *
from tb_students
where age>24 and exists(
select course_name
from tb_course
where id=1)

SELECT * FROM (SELECT * FROM result) AS Temp;

正則

選項說明例子匹配值示例
^ 匹配文字的開始字元 '^b' 匹配以字母 b 開頭的字串 book、big、banana、bike
$ 匹配文字的結束字元 'st$' 匹配以 st 結尾的字串 test、resist、persist
. 匹配任何單個字元 'b.t' 匹配任何 b 和 t 之間有一個字元 bit、bat、but、bite
* 匹配零個或多個在它前面的字元 'f*n' 匹配字元 n 前面有任意個字元 f fn、fan、faan、abcn
+ 匹配前面的字元 1 次或多次 'ba+' 匹配以 b 開頭,後面至少緊跟一個 a ba、bay、bare、battle
<字串> 匹配包含指定字元的文字 'fa' 匹配包含‘fa’的文字 fan、afa、faad
[字元集合] 匹配字元集合中的任何一個字元 '[xz]' 匹配 x 或者 z dizzy、zebra、x-ray、extra
[^] 匹配不在括號中的任何字元 'abc' 匹配任何不包含 a、b 或 c 的字串 desk、fox、f8ke
字串{n,} 匹配前面的字串至少 n 次 'b{2}' 匹配 2 個或更多的 b bbb、bbbb、bbbbbbb
字串 {n,m} 匹配前面的字串至少 n 次, 至多 m 次 'b{2,4}' 匹配最少 2 個,最多 4 個 b bbb、bbbb
select *
from tb_users
where name regexp '^J';

插入

insert into tb_users(name, grade)
values('name1', '1'), ('name2', '2');

# 複製表
insert into tb_students(name, sex, info)
select name, sex, info
from tb_users;

修改

update table_name
set name='value', name2='value2'
where id>0
order by id
limit 2,9

刪除

delete from table_name
where id>0
order by id
limit 3,9

清空表

# DDL 資料定義語句
# 直接刪除表,再建一張新表;delete是一條一條刪除
# delete可配合事務回滾,truncate刪除後無法找回
# delete返回刪除資料行數,truncate返回0
truncate tabel_name

檢視

檢視都是儲存在 information_schema 資料庫的 views 表下。SELECT * FROM information_schema.views;

檢視的使用方法與表類似。

  • 檢視不是資料庫中真實的表,而是一張虛擬表,其結構和資料是建立在對資料中真實表的查詢基礎上的。

  • 儲存在資料庫中的查詢操作 SQL 語句定義了檢視的內容,列資料和行資料來自於檢視查詢所引用的實際表,引用檢視時動態生成這些資料。

  • 檢視沒有實際的物理記錄,不是以資料集的形式儲存在資料庫中的,它所對應的資料實際上是儲存在檢視所引用的真實表中的。

  • 檢視是資料的視窗,而表是內容。表是實際資料的存放單位,而檢視只是以不同的顯示方式展示資料,其資料來源還是實際表。

  • 檢視是檢視資料表的一種方法,可以查詢資料表中某些欄位構成的資料,只是一些 SQL 語句的集合。從安全的角度來看,檢視的資料安全性更高,使用檢視的使用者不接觸資料表,不知道表結構。

  • 檢視的建立和刪除隻影響檢視本身,不影響對應的基本表。

  • ORDER BY 子句可以用在檢視中,但若該檢視檢索資料的 SELECT 語句中也含有 ORDER BY 子句,則該檢視中的 ORDER BY 子句將被覆蓋。

建立檢視時,select語句的要求:

  • 使用者除了擁有 CREATE VIEW 許可權外,還具有操作中涉及的基礎表和其他檢視的相關許可權。

  • SELECT 語句不能引用系統或使用者變數。

  • SELECT 語句不能包含 FROM 子句中的子查詢。

  • SELECT 語句不能引用預處理語句引數

當檢視的語句含有特定結構時,不可更新:

  • 聚合函式 SUM()、MIN()、MAX()、COUNT() 等。

  • DISTINCT 關鍵字。

  • GROUP BY 子句。

  • HAVING 子句。

  • UNION 或 UNION ALL 運算子。

  • 位於選擇列表中的子查詢。

  • FROM 子句中的不可更新檢視或包含多個表。

  • WHERE 子句中的子查詢,引用 FROM 子句中的表。

  • ALGORITHM 選項為 TEMPTABLE(使用臨時表總會使檢視成為不可更新的)的時候。

# 建立檢視
create view view_name as <select_語句>

CREATE VIEW view_students_info
AS SELECT * FROM tb_students_info;

CREATE VIEW v_students_info (s_id,s_name,d_id,s_age,s_sex,s_height,s_date)
AS SELECT id,name,dept_id,age,sex,height,login_date
FROM tb_students_info;

# 查詢檢視
desc v_students_info;

# 檢視檢視詳細資訊
show create view view_name \G;

# 修改檢視
alter view view_name as <select_語句>

ALTER VIEW view_students_info
AS SELECT id,name,age FROM tb_students_info;

# 刪除檢視
drop view view_name [, view_name2 ...]

DROP VIEW IF EXISTS v_students_info;

索引

  1. 普通索引 使用 index, key CREATE INDEX index_id ON tb_student(id);

  2. 唯一索引 使用 unique

  3. 主鍵索引 使用 primary key

  4. 空間索引 使用 spatial CREATE SPATIAL INDEX index_line ON tb_student(line);

索引設計原則

  1. 選擇唯一性索引

  2. 為經常需要排序、分組和聯合操作的欄位建立索引

  3. 為常作為查詢條件的欄位建立索引

  4. 限制索引的數目

  5. 儘量使用資料量少的索引

  6. 資料量小的表最好不要使用索引

  7. 儘量使用字首來索引

  8. 刪除不再使用或者很少使用的索引

# 建立索引
CREATE <索引名> ON <表名> (<列名> [<長度>] [ ASC | DESC])

# 在使用 create table 建立表時新增 primary key,
# key, index, unique, foreign key

# 在使用 alter table 修改表時,使用 add index/primary key/unique 等

# 檢視索引
SHOW INDEX FROM <表名> [ FROM <資料庫名>]

SHOW INDEX FROM tb_stu_info2\G

# 刪除索引
drop index index_name on table_name_
alter table table_name_ drop ...

儲存過程

有時需要多條sql語句處理多個表才能完成操作。儲存過程是一組為了完成特定功能的sql語句集合。使用儲存過程的目的是將工作預先用 SQL 語句寫好並用指定名稱儲存,經編譯和優化後儲存在資料庫中。當使用時,呼叫“CALL儲存過程名字”即可自動完成。

儲存過程都儲存在information_schema的Routines表下 SELECT * FROM information_schema.Routines WHERE ROUTINE_NAME=儲存過程名;

# 建立儲存過程
CREATE PROCEDURE <過程名> ( [過程引數[,…] ] ) <過程體>
[過程引數[,…] ] 格式
[ IN | OUT | INOUT ] <引數名> <型別>
BEGIN
...
END <結束符號,由 delimiter 定義>

DELIMITER // # 定義結束符號,防止與單個語句的;弄混
CREATE PROCEDURE ShowStuScore()
BEGIN # 開始過程
SELECT * FROM tb_students_score;
END // # 過程結束

DELIMITER //
CREATE PROCEDURE GetScoreByStu
(IN name VARCHAR(30))
BEGIN
SELECT student_score FROM tb_students_score
WHERE student_name=name;
END//

# 檢視儲存過程
SHOW PROCEDURE STATUS LIKE 儲存過程名; # 狀態
SHOW CREATE PROCEDURE 儲存過程名; # 定義

SHOW PROCEDURE STATUS LIKE 'showstuscore' \G

# 修改儲存過程
ALTER PROCEDURE 儲存過程名 [ 特徵 ... ]

ALTER PROCEDURE showstuscore MODIFIES SQL DATA SQL SECURITY INVOKER;

# 刪除儲存過程
DROP PROCEDURE [ IF EXISTS ] <過程名>

DROP PROCEDURE ShowStuScore;

特徵指定了儲存過程的特性,可能的取值有:

  • CONTAINS SQL 表示子程式包含 SQL 語句,但不包含讀或寫資料的語句。

  • NO SQL 表示子程式中不包含 SQL 語句。

  • READS SQL DATA 表示子程式中包含讀資料的語句。

  • MODIFIES SQL DATA 表示子程式中包含寫資料的語句。

  • SQL SECURITY { DEFINER |INVOKER } 指明誰有許可權來執行。

  • DEFINER 表示只有定義者自己才能夠執行。

  • INVOKER 表示呼叫者可以執行。

  • COMMENT 'string' 表示註釋資訊。

觸發器

通過對資料表的相關操作來觸發、啟用從而實現執行。比如當對 student 表進行操作(mysql中只有 INSERT,DELETE 或 UPDATE)時就會啟用它執行。

SELECT * FROM information_schema.triggers WHERE trigger_name= '觸發器名';

# 檢視觸發器
SHOW TRIGGERS

# 建立觸發器
CREATE <觸發器名> < BEFORE | AFTER >
<INSERT | UPDATE | DELETE >
ON <表名> FOR EACH Row<觸發器主體>

CREATE TRIGGER SumOfSalary
BEFORE INSERT ON tb_emp8
FOR EACH ROW
SET @sum=@sum+NEW.salary;

CREATE TRIGGER SumOfSalary
BEFORE INSERT ON tb_emp8
FOR EACH ROW
SET @sum=@sum+NEW.salary;

CREATE TRIGGER double_salary
AFTER INSERT ON tb_emp6
FOR EACH ROW
INSERT INTO tb_emp7
VALUES (NEW.id,NEW.name,deptId,2*NEW.salary);

# 刪除觸發器
DROP TRIGGER [ IF EXISTS ] [資料庫名] <觸發器名>

事件

# 檢視事件是否開啟
SHOW VARIABLES LIKE 'event_scheduler';
SELECT @@event_scheduler;
SHOW PROCESSLIST;
# 開啟事件
SET GLOBAL event_scheduler = ON ; -- 也可直接修改配置檔案 event_scheduler = ON

# 建立事件
CREATE EVENT [IF NOT EXISTS] event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'comment']
DO event_body;

CREATE EVENT IF NOT EXISTS e_test
ON SCHEDULE EVERY 5 SECOND
ON COMPLETION PRESERVE
DO INSERT INTO tb_eventtest(user,createtime)VALUES('MySQL',NOW());

# 檢視事件
SELECT * FROM information_schema.events limit 1\G

# 修改事件
ALTER EVENT event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'comment']
DO event_body;

ALTER EVENT e_test ON SCHEDULE EVERY 30 SECOND
ON COMPLETION PRESERVE
DO INSERT INTO tb_eventtest(user,createtime) VALUES('MySQL',NOW());

# 刪除事件
DROP EVENT [IF EXISTS] event_name;

事務

預設開啟事務自動提交,除了顯式的(begin, start transaction),每一條sql語句都被當做事務執行。

> BEGIN
> update ...
> insert ...
> COMMIT

> BEGIN
> update ...
> update ...(error)
> ROLLBACK

SHOW VARIABLES LIKE 'autocommit'; -- 檢視是否預設開啟事務自動提交
SET autocommit = 0|1|ON|OFF; -- 關閉自動提交
# 關閉自動提交後需要執行 commit 才能將資料寫入資料庫

# 檢視事務隔離級別
show variables like '%tx_isolation%';
select @@tx_isolation;

# 修改事務隔離級別
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}

MySQL 包括的事務隔離級別如下:

  • 讀未提交(READ UNCOMITTED)

  • 讀提交(READ COMMITTED)

  • 可重複讀(REPEATABLE READ)

  • 序列化(SERIALIZABLE)

隔離級別髒讀不可重複讀幻讀
READ UNCOMITTED
READ COMMITTED ×
REPEATABLE READ × ×
SERIALIZABLE × × ×

使用者管理

# 建立使用者
CREATE USER <使用者>
[ IDENTIFIED BY [ PASSWORD ] 'password' ]
[ ,使用者 [ IDENTIFIED BY [ PASSWORD ] 'password' ]]

CREATE USER 'test1'@"localhost" IDENTIFIED BY 'test1';

SELECT password('test1'); -- 獲得密碼對應雜湊值
CREATE USER 'test1'@'localhost'IDENTIFIED BY PASSWORD '*06C0BF5B64ECE2F648B5F048A71903906BA08E5C';

-- 直接插入mysql資料庫的user表中
INSERT INTO mysql.user(Host, User, authentication_string, ssl_cipher, x509_issuer, x509_subject)
VALUES ('hostname', 'username', PASSWORD('password'), '', '', '');

# 設定許可權,無使用者則建立
GRANT priv_type
ON database.table
TO user [IDENTIFIED BY [PASSWORD] 'password']

GRANT SELECT
ON*.*
TO 'test3'@localhost IDENTIFIED BY 'test3';

# 重新命名賬號
RENAME USER <舊使用者> TO <新使用者>

# 刪除使用者
drop user 使用者1, 使用者2 ...
DELETE FROM mysql.user WHERE Host='hostname' AND User='username';

# 檢視許可權
SELECT * FROM mysql.user;
SHOW GRANTS FOR 'username'@'hostname';

# 授權
GRANT priv_type [(column_list)]
ON database.table
TO user [IDENTIFIED BY [PASSWORD] 'password']
[, user[IDENTIFIED BY [PASSWORD] 'password']] ...
[WITH with_option [with_option]...]

# 取消授權
REVOKE priv_type [(column_list)]...
ON database.table -- 不指定則是所有
FROM user [, user]...



# 使命令生效
FLUSH PRIVILEGES;

授權中 with_optin 引數

  • GRANT OPTION:被授權的使用者可以將這些許可權賦予給別的使用者;

  • MAX_QUERIES_PER_HOUR count:設定每個小時可以允許執行 count 次查詢;

  • MAX_UPDATES_PER_HOUR count:設定每個小時可以允許執行 count 次更新;

  • MAX_CONNECTIONS_PER_HOUR count:設定每小時可以建立 count 個連線;

  • MAX_USER_CONNECTIONS count:設定單個使用者可以同時具有的 count 個連線。

修改密碼

# root 修改普通使用者密碼
alter user 'root'@'localhost' identified by '123';

UPDATE MySQL.user
SET authentication_string = PASSWORD("newpwd")
WHERE User = "username" AND Host = "hostname";

GRANT USAGE
ON *.*
TO 'user'@’hostname’ IDENTIFIED BY 'newpwd';

# 修改 root 密碼
mysqladmin -u username -h hostname -p password "newpwd"

備份與恢復

  • 熱備(Hot Backup)

    • 邏輯備份

    • 裸檔案備份

  • 冷備(Cold Backup)

    • 關機後,直接將資料目錄複製

  • 溫備(Warm Backup)

mysqldump -u username -p dbname [tbname ...]> filename.sql -- 備份
mysql -u username -P [dbname] < filename.sql -- 恢復

SELECT * FROM test.person INTO OUTFILE "/opt/person.txt"
# 如果匯出出錯,show variables like '%secure%';,檢視 secure_file_priv
LOAD DATA INFILE "/opt/person.txt"

日誌

  1. 錯誤日誌

[mysqld]
log-error=dir/{filename}
SHOW VARIABLES LIKE 'log_error'; # 檢視錯誤日誌位置

mysqladmin -uroot -p flush-logs # 刪除錯誤日誌
  1. 二進位制日誌

主要用於記錄資料庫的變化情況,即 SQL 語句的 DDL 和 DML 語句,不包含資料記錄查詢操作。

如果 MySQL 資料庫意外停止,可以通過二進位制日誌檔案來檢視使用者執行了哪些操作,對資料庫伺服器檔案做了哪些修改,然後根據二進位制日誌檔案中的記錄來恢復資料庫伺服器。

# 檢視是否開啟
SHOW VARIABLES LIKE 'log_bin';

# 配置檔案中設定 log-bin=C:log\mylog

# 檢視
SHOW binary logs;
SHOW master status; -- 檢視當前正在寫入的二進位制日誌檔案

mysqlbinlog filename.number # 需要在二進位制日誌所在的目錄下執行該命令

# 刪除
RESET MASTER;
PURGE MASTER LOGS TO 'filename.number'; -- 刪除指定編號之前的日誌
PURGE MASTER LOGS TO 'yyyy-mm-dd hh:MM:ss';

# 開啟或關閉二進位制日誌
SET SQL_LOG_BIN=0/1;

# 通過二進位制日誌還原資料庫
mysqlbinlog filename.number | mysql -u root -p

  1. 查詢日誌

記錄使用者的所有操作,包括啟動和關閉 MySQL 服務、更新語句和查詢語句等。

# 檢視是否開啟查詢日誌
SHOW VARIABLES LIKE '%general%';

# 配置檔案
[mysqld]
log=dir/filename

# 刪除日誌
mysqladmin -uroot -p flush-logs

  1. 慢查詢日誌

慢查詢日誌用來記錄在 MySQL 中執行時間超過指定時間的查詢語句

# 檢視
SHOW VARIABLES LIKE 'slow_query%';

# 設定
[mysqld]
log-slow-queries=dir\filename
long_query_time=10

SET GLOBAL slow_query_log=ON/OFF;
SET GLOBAL long_query_time=n;

日誌輸出方式

SHOW VARIABLES LIKE '%log_out%';

SET GLOBAL log_output='TABLE';