Mysql從入門到精通整理


 目錄

 

正文

數據庫是信息化產業的最基礎的軟件之一,各種管理系統,網站,在線游戲,背后基本都會有數據庫的支持。

mysql基礎

數據庫基本概念

MariaDB or MySQL官網:https://db-engines.com/en/ranking

磁盤文件--> 層次模型 --> 網狀模型 --> (Codd) 關系模型
DBMS是管理數據庫的系統軟件,它實現數據庫系統的各種功 能。是數據庫系統的核心

DBA:負責數據庫的規划、設計、協調、維護和管理等工作

關系 :關系就是二維表。並滿足如下性質: 表中的行、列次序並不重要

行row:表中的每一行,又稱為一條記錄

列column:表中的每一列,稱為屬性,字段

主鍵(Primary key):用於惟一確定一個記錄的字段;復合主鍵:多個字段組合成一個主鍵(NOT NULL);

惟一鍵:一個或多個字段的組合,填入的數據必須能在本表 中唯一標識本行;允許為NULL,一個表可以存在多個

約束:
  主鍵約束:惟一、非空;一張表只能有一個;
  惟一鍵約束:惟一,可以存在多個;
  外鍵約束:參考性約束;
  檢查性約束:check;

三層模型:
  物理層 --> SA (決定數據的存儲格式,即RDBMS在磁盤上如何組織文件)
  邏輯層 --> DBA(描述存儲什么數據,以及數據間存在什么樣的關系)
  視圖層 --> Coder(描述DB中的部分數據)

域domain:屬性的取值范圍,如,性別只能是‘男’和‘女’ 兩個值

表:row, column;
關系運算:選擇、投影
數據庫:表、索引、視圖(虛表)、SQL、存儲過程procedure,過程無返回值、存儲函數function,過程有返回值、觸發器trigger、事件調度器event scheduler,任務計划;
事務transaction:多個操作被當作一個整體對待 ACID: 原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、持久性(Durability)。

原子性:整個事務中的所有操作,要么全部完成,要么全部不完成,不可能停滯在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。

一致性:在事務開始之前和事務結束以后,數據庫的完整性約束沒有被破壞。

隔離性:兩個事務的執行是互不干擾的,一個事務不可能看到其他事務運行時,中間某一時刻的數據。

持久性:在事務完成以后,該事務所對數據庫所作的更改便持久的保存在數據庫之中,並不會被回滾。

數據的操作:• 數據提取:在數據集合中提取感興趣的內容。(SELECT)• 數據更新:變更數據庫中的數據。(INSERT、DELETE、 UPDATE)

應用程序指以數據庫為基礎的應用程序:DBMS --> RDBMS(關系型數據庫管理系統)

設計關系數據庫時,遵從不同的規范要求,設計出合理的 關系型數據庫,這些不同的規范要求被稱為不同的范式,各種范 式呈遞次規范,越高的范式數據庫冗余越小。

目前關系數據庫有六種范式:第一范式(1NF)、第二范式 (2NF)、第三范式(3NF)、巴德斯科范式(BCNF)、第 四范式(4NF)和第五范式(5NF,又稱完美范式)。滿足最 低要求的范式是第一范式(1NF)。在第一范式的基礎上進 一步滿足更多規范要求的稱為第二范式(2NF),其余范式 以次類推。一般說來,數據庫只需滿足第三范式(3NF)即可
RDBMS:
范式:第一范式、第二范式、第三范式;

1NF:無重復的列,每一列都是不可分割的基本數據項,同 一列中不能有多個值

2NF:屬性完全依賴於主鍵,第二范式必須先滿足第一范式 ,要求表中的每個行必須可以被唯一地區分。

3NF:屬性不依賴於其它非主屬性,滿足第三范式必須先滿 足第二范式。第三范式要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字信息,非PK的字段間不能有從屬關系

SQL: Structure Query Language:結構化查詢語言--- SQL解釋器---數據存儲協議:應sq用層協議,C/S

olacle(tcp:1521),mysql(tcp:3306),sql  server(tcp:1433)

mysql基礎和應用結構

mysql特性:插件式存儲引擎、單進程多線程

mysql體系結構:

 

安裝:服務端mysql-server和客戶端mysql,yum安裝,二進制安裝,源碼編譯安裝

提高安全性 :運行mysql_secure_installation

 

服務端程序:
mysqld, mysqld_safe, mysqld_multi
客戶端程序:
mysql, mysqldump, mysqlbinlog, mysqladmin, ...
非客戶端類管理程序:
myisamchk, myisampack, ...

配置文件: /etc/my.cnf 和 /etc /my.cnf.d/ *.cnf
mysql命令選項:

-uUSERNAME: 用戶名;默認為root

-hHOST: 服務器主機; 默認為localhost

-pPASSWORD:用戶的密碼;建議使用-p,默認為空密碼

mysql用戶賬號由兩部分組成: 'USERNAME'@'HOST' HOST用於限制此用戶可通過哪些遠程主機連接mysql服務

支持使用通配符: % 匹配任意長度的任意字符 172.16.64.0/16 或 172.16.%.% _ 匹配任意單個字符

運行mysql前通常修改的參數

在配置文件的[mysqld]中添加兩個選項: 

innodb_file_per_table = on  啟用innodb存儲引擎

skip_name_resolve = on 禁止主機名解析

MYSQL語言基礎

在數據庫系統中,SQL語句不區分大小寫(建議用大寫) ,但字符串常量區分大小寫

SQL語句可單行或多行書寫,以“;”結尾,關鍵詞不能跨多行或簡寫

用空格和縮進來提高語句的可讀性 ,句通常位於獨立行,便於編輯,提高可讀性

注釋: SQL標准: /*注釋內容*/ 多行注釋      -- 注釋內容 單行注釋,注意有空格

MySQL注釋: #

 

數據庫對象的命名規則 :1.必須以字母開頭 ;2.可包括數字和三個特殊字符(# _ $);3.不要使用MySQL的保留字 ;4.同一Schema下的對象不能同名

MySQL的數據類型:字符型、數值型、日期時間型、內建類型
字符型:CHAR(#), BINARY(#):定長型;CHAR不區分字符大小寫,而BINARY區分;

               VARCHAR(#), VARBINARY(#):變長型TEXT:TINYTEXT,TEXT,MEDIUMTEXT,LONGTEXT

               BLOB:TINYBLOB,BLOB,MEDIUMBLOB, LONGBLOB
數值型:
浮點型:近似FLOAT、DOUBLE、REAL、BIT
整型:精確:INTEGER:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT;DECIMAL
日期時間型:日期:DATE;時間:TIME;日期j時間:DATETIME;間戳:TIMESTAMP;年份:YEAR(2), YEAR(4)
內建:ENUM:枚舉:ENUM('Sun','Mon','Tue','Wed');SET:集合

類型修飾符:
    字符型:NOT NULL,NULL,DEFALUT ‘STRING’,CHARACET SET ‘CHARSET’,COLLATION ‘collocation'
    整型:NOT NULL, NULL, DEFALUT value, AUTO_INCREMENT, UNSIGNED(使用unsigned會使數據可變長度增長一倍)
    日期時間型:NOT NULL, NULL, DEFAULT
DML:
INSERT/REPLACE(增), DELETE(刪), SELECT(查), UPDATE(改),ALTER。

創建數據庫:CREATE    DATABASE  |SCHEMA   [IF NOT EXISTS]   'DB_NAME'; 

刪除數據庫:DROP    DATABASE   |   SCHEMA   [IF EXISTS]   'DB_NAME';

查看支持所有字符集:SHOW CHARACTER SET;  

查看支持所有排序規則:SHOW COLLATION;

查看數據庫列表:SHOW DATABASES;  

創建表:CREATE  TABLE  'DB_TABLE_NAME' ;

刪除表:DROP TABLE [IF EXISTS] tb_name;

查看表: USE   'DB_NAME'  ;  SHOW  TABLES ;

查看支持的engine類型:SHOW ENGINES;

查看表結構:DESC [db_name . ]tb_name;

查看表狀態:SHOW TABLE STATUS LIKE 'tbl_name'\G

實例:

CREATE TABLE students   (id   int   UNSIGNED NOT NULL PRIMARY KEY,name VARCHAR(20)NOT NULL,age tinyint UNSIGNED);

DESC students;

CREATE TABLE students2 (id   int   UNSIGNED NOT NULL ,name VARCHAR(20)NOT NULL,age tinyint UNSIGNED,PRIMARY KEY(id,name));

ALTER   TABLE   students   RENAME s1; (重命名)

ALTER TABLE  s1   ADD  phone  varchar(11)   AFTER name;

ALTER TABLE   s1  MODIFY  phone int;

ALTER TABLE   s1 CHANGE  COLUMN  phone  mobile char(11);

ALTER TABLE   s1  DROP  COLUMN mobile;

ALTER TABLE students ADD gender ENUM('m','f')    (枚舉,gender的域值為m和f)

ALETR TABLE students  CHANGE id   sid  int  UNSIGNED NOT NULL PRIMARY KEY;

ALTER TABLE students ADD UNIQUE KEY(name);  (唯一鍵)

ALTER TABLE students ADD INDEX(age);  (添加age的索引)

SHOW INDEXES FROM students;

ALTER TABLE students DROP age;

索引:定義在查找時作為查找條件的字段 ----優點:提高查詢速度 ;缺點:占用額外空間,影響插入速度  (創建索引必須要有索引名稱)

創建索引: CREATE INDEX   index_name   ON tbl_name (index_col_name,...);

刪除索引: DROP INDEX index_name ON tbl_name;

查看索引: SHOW INDEXES FROM [db_name.]tbl_name;

INSERT:(插入,增)
INSERT    [INTO]    tbl_name    [(col_name,...)]   {VALUES | VALUE}     (val1,...),(...),...

UPDATE:(改)

UPDATE   tbl_name  SET col1=val1, col2=val2, ... [WHERE clause]    [ORDER BY 'col_name' [DESC]] [LIMIT [m,]n];

DELETE::(刪)

DELETE   FROM    tbl_name   [WHERE clause]   [ORDER BY 'col_name' [DESC]] [LIMIT [m,]n]; 可先排序再指定刪除的行數

SELECT col1,col2,... FROM tbl_name [WHERE clause] [ORDER BY 'col_name' [DESC]] [LIMIT [m,]n];  Limit m,n 跳過m個,要n個

SELECT字段表示法:  *: 所有字段      as:字段別名, col1 AS alias1  例:

WHERE clause:

操作符: >, <, >=, <=, ==, != , BETWEEN ... AND ...    

LIKE:  %:任意長度的任意字符 ;  _:任意單個字符;

RLIKE:正則表達式模式匹配

IS NULL ,IS NOT NULL IN (val1,val2,…)

條件邏輯操作: and,or,not

示例:

DESC students;

INSERT INTO students VALUES(1,'tom','m'),(2,'alice','f');

INSERT INTO students  (id,name) VALUES(3,'jack'),(4,'allen');

SELECT * FROM students WHERE id < 3;

SELECT * FROM students WHERE gender='m';

SELECT * FROM students WHERE gender IS NULL;

SELECT * FROM students WHERE gender IS NOT NULL;

SELECT * FROM students ORDER BY name DESC LIMIT 2;  (符合條件的前兩個)

SELECT * FROM students ORDER BY name DESC LIMIT 1,2;

SELECT * FROM students  WHERE id >=2 and id <=4;

SELECT * FROM students  WHERE BETWEEN 2 AND 4 ;

SELECT * FROM students WHERE name LIKE ‘t%’

SELECT * FROM students WHERE name RLIKE '.*[lo].*';

SELECT   id   stuid ,  name as stuname FROM students

查詢執行路徑:
  請求-->查詢緩存
  請求-->查詢緩存-->解析器-->預處理器-->優化器-->查詢執行引擎-->存儲引擎-->緩存-->響應
SELECT語句的執行流程:FROM --> WHERE --> Group By --> Having --> Order BY --> SELECT --> Limit

mysql用戶與授權管理

用戶創建、查看、刪除與密碼管理

創建用戶: CREATE USER   'username'@'host'   [IDENTIFIED BY 'password'];

查看當前用戶: SELECT  user();

查看用戶: SELECT   User,Host,Password  FROM user;

刪除用戶:DROP USER 'username'@'host'; 示例:刪除默認的空用戶 DROP USER ''@'localhost';

更改口令: 1)SET PASSWORD FOR 'user'@'host' = PASSWORD(‘password');

      2) UPDATE user SET password=PASSWORD('magedu') WHERE User='root' ;

                   注意:上面修改表的命令不會馬上生效,需執行FLUSH PRIVILEGES生效

         3) /usr/local/mysql/bin/mysqladmin -u root –poldpassword password 'newpassword

                   4)刪除mysql數據庫目錄/var/lib/mysql/mysql/下的mysql數據庫,此時所有用戶信息都丟失,且可以空口令登錄

忘記管理員密碼的解決辦法:
(1) 啟動mysqld進程時,使用--skip-grant-tables和--skip-networking選項;
  CentOS 7:mariadb.service
  CentOS 6:/etc/init.d/mysqld
(2) 通過UPDATE命令修改管理員密碼; 
(3) 以正常 方式啟動mysqld進程;
  

mysql授權

權限級別:管理權限、數據庫、表、字段、存儲例程

GRANT   priv_type,... ON    [object_type]    db_name.tb_name    TO    'user'@'host'   [IDENTIFIED   BY   'password'] [WITH GRANT OPTION];

priv_type: ALL [PRIVILEGES] ,select,insert,update,delete,alter

示例: GRANT   SELECT,DELETE  on  testdb.*   TO  'testuser'@'%'   IDENTIFIED  BY  'testpass‘;(一步就包含創建用戶和授權)

查看指定用戶獲得的授權:

Help SHOW

GRANTS SHOW GRANTS FOR 'user'@'host';

SHOW GRANTS FOR CURRENT_USER();

回收授權:  REVOKE priv_type, ... ON db_name.tb_name FROM 'user'@'host

示例: REVOKE DELETE ON testdb.* FROM 'testuser'@'%‘

注意:MariaDB服務進程啟動時會讀取mysql庫中所有授權表至內存

(1) GRANT或REVOKE等執行權限操作會保存於系統表中,MariaDB的服 務進程通常會自動重讀授權表,使之生效

(2) 對於不能夠或不能及時重讀授權表的命令,可手動讓MariaDB的服務進 程重讀授權表:mysql> FLUSH PRIVILEGES;

練習與思考:

導入hellodb.sql生成數據庫
(1) 在students表中,查詢年齡大於25歲,且為男性的同學的名字和年齡;
SELECT Name,Age FROM students WHERE Age > 25 AND Gender='M';
(2) 以ClassID為分組依據,顯示每組的平均年齡;
SELECT ClassID,avg(age) FROM students GROUP BY ClassID;
(3) 顯示第2題中平均年齡大於30的分組及平均年齡;
SELECT ClassID,avg(age) AS Aging FROM students GROUP BY ClassID HAVING Aging>30;
(4) 顯示以L開頭的名字的同學的信息;
SELECT * FROM students WHERE Name LIKE 'L%';
(5) 顯示TeacherID非空的同學的相關信息;
SELECT * FROM students WHERE TeacherID IS NOT NULL;
(6) 以年齡排序后,顯示年齡最大的前10位同學的信息;
SELECT * FROM students ORDER BY Age DESC LIMIT 10;
(7) 查詢年齡大於等於20歲,小於等於25歲的同學的信息;用三種方法;


練習:導入hellodb.sql,以下操作在students表上執行
1、以ClassID分組,顯示每班的同學的人數;
SELECT ClassID,count(StuID) FROM students GROUP BY ClassID;
2、以Gender分組,顯示其年齡之和;
SELECT Gender,SUM(Age) FROM students GROUP BY Gender;
3、以ClassID分組,顯示其平均年齡大於25的班級;
SELECT ClassID,avg(age) FROM students GROUP BY ClassID HAVING avg(Age) > 25;
4、以Gender分組,顯示各組中年齡大於25的學員的年齡之和;


練習:導入hellodb.sql,完成以下題目:
1、顯示前5位同學的姓名、課程及成績;
2、顯示其成績高於80的同學的名稱及課程;
3、求前8位同學每位同學自己兩門課的平均成績,並按降序排列;
4、顯示每門課程課程名稱及學習了這門課的同學的個數;

 

思考:
1、如何顯示其年齡大於平均年齡的同學的名字?
2、如何顯示其學習的課程為第1、2,4或第7門課的同學的名字?
3、如何顯示其成員數最少為3個的班級的同學中年齡大於同班同學平均年齡的同學?
4、統計各班級中年齡大於全校同學平均年齡的同學。 

mysql進階

存儲引擎

SHOW TABLE STATUS
常見的存儲引擎:SHOW ENGINES;
MyISAM, Aria, InnoDB, MRG_MYISAM, CSV, BLACKHOLE, MEMORY, PERFORMANCE_SCHEMA, ARCHIVE, FEDERATED
InnoDB:InnoBase

SHOW ENGINE INNODB STATUS;
MyISAM:

行格式:{DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
其它的存儲引擎:
CSV:將CSV文件(以逗號分隔字段的文本文件)作為MySQL表文件;
MRG_MYISAM:將多個MyISAM表合並成的虛擬表;
BLACKHOLE:類似於/dev/null,不真正存儲數據;
MEMORY:內存存儲引擎,支持hash索引,表級鎖,常用於臨時表;
FEDERATED: 用於訪問其它遠程MySQL服務器上表的存儲引擎接口;

並發控制:鎖機制:Lock 

事務

事務:一組原子性的SQL查詢、或者是一個或多個SQL語句組成的獨立工作單元;
事務日志:
innodb_log_files_in_group
innodb_log_group_home_dir
innodb_log_file_size
innodb_mirrored_log_groups
ACID測試
A:AUTOMICITY,原子性;整個事務中的所有操作要么全部成功執行,要么全部失敗后回滾;
C:CONSISTENCY,一致性;數據庫總是應該從一個一致性狀態轉為另一個一致性狀態;
I:ISOLATION,隔離性;一個事務所做出的操作在提交之前,是否能為其它事務可見;出於保證並發操作之目的,隔離有多種級別;
D:DURABILITY,持久性;事務一旦提交,其所做出的修改會永久保存;
自動提交:單語句事務
mysql> SELECT @@autocommit;
+------------------------+
| @@autocommit |
+------------------------+
| 1 |
+------------------------+
mysql> SET @@session.autocommit=0;
手動控制事務:
啟動:START TRANSACTION
提交:COMMIT
回滾:ROLLBACK
事務支持savepoints:
SAVEPOINT identifier
ROLLBACK [WORK] TO [SAVEPOINT] identifier
RELEASE SAVEPOINT identifier
事務隔離級別
READ-UNCOMMITTED:讀未提交 --> 臟讀;
READ-COMMITTED:讀提交--> 不可重復讀;
REPEATABLE-READ:可重復讀 --> 幻讀;
SERIALIZABLE:串行化;

mysql> SELECT @@session.tx_isolation;
+----------------------------------+
| @@session.tx_isolation |
+----------------------------------+
| REPEATABLE-READ |
+----------------------------------+
查看InnoDB存儲引擎的狀態信息:
SHOW ENGINE innodb STATUS;

查看授權: SHOW GRANTS [FOR 'user'@'host']
取消授權:REVOKE    priv_type [(column_list)][, priv_type [(column_list)]] ... ON [object_type] priv_level    FROM 'user'@'host' [, 'user'@'host'] ...
REVOKE ALL PRIVILEGES, GRANT OPTION   FROM user [, user] ..

MySQL的索引:

索引:提取索引的創建在的表上字段中的數據,構建出一個獨特的數據結構;
索引的作用:加速查詢操作;副作用:降低寫操作性能;
表中數據子集:把表中某個或某些字段的數據提取出來另存為一個特定數據結構組織的數據;
某個字段或某些字段:WHERE子句中用到的字段;
索引類型:B+ TREE,HASH,B- TREE
B+ TREE:順序存儲,每一個葉子結點到根結點的距離相同;左前綴索引,適合於范圍類型的數據查詢;(mysql默認索引)
適用於B+ TREE索引的查詢類型:全鍵值、鍵值范圍或鍵前綴;
  全值匹配:精確匹配某個值;    WHERE COLUMN = 'value';        

  匹配最左前綴:只精確匹配起頭的部分;      WEHRE COLUMN LIKE 'PREFIX%';
匹配范圍值:精確匹配某一列,范圍匹配另一列;只用訪問索引的查詢:覆蓋索引;
index(Name)
SELECT Name FROM students WHERE Name LIKE 'L%';
不適用B+ TREE索引:
如果查詢條件不是從最左側列開始,索引無效;
index(age,Fname), WHERE Fname='Jerry'; , WHERE age>30 AND Fname='Smith';
不能跳過索引中的某列;
index(name,age,gender)
WHERE name='black' and age > 30;
WHERE name='black' AND gender='F';
如果查詢中的某個列是為范圍查詢,那么其右側的列都無法再使用索引優化查詢;WHERE age>30 AND Fname='Smith';
Hash索引:基於哈希表實現,特別適用於值的精確匹配查詢;
適用場景:只支持等值比較查詢,例如=, IN(), <=>
不用場景:所有非精確值查詢;MySQL僅對memory存儲引擎支持顯式的hash索引;
索引優點:
  降低需要掃描的數據量,減少IO次數;
  可以幫助避免排序操作,避免使用臨時表;
  幫助將隨機IO轉為順序IO;
高性能索引策略:
(1) 在WHERE中獨立使用列,盡量避免其參與運算; 如,WHERE age+2 > 32 ;
(2) 左前綴索引:索引構建於字段的最左側的多少個字符,要通過索引選擇性來評估索引選擇性:不重復的索引值和數據表的記錄總數的比值;
(3) 多列索引:AND連接的多個查詢條件更適合使用多列索引,而非多個單鍵索引;
(4) 選擇合適的索引列次序:選擇性最高的放左側;

EXPLAIN來分析索引有效性:
EXPLAIN [explain_type] SELECT select_options
輸出結果:
id:當前查詢語句中,第個SELECT語句的編號;
select_type:查詢類型:
table:查詢針對的表;
type:關聯類型,或稱為訪問類型,即MySQL如何去查詢表中的行
  ALL:全表掃描;
  index:根據索引的順序進行的全表掃描;但同時如果Extra列出現了"Using index”表示使用了覆蓋索引;
  range:有范圍限制地根據索引實現范圍掃描;掃描位置始於索引中的某一項,結束於另一項;
  ref:根據索引返回的表中匹配到某單個值的所有行(匹配給定值的行不止一個);
  eq_ref:根據索引返回的表中匹配到某單個值的單一行,僅返回一個行,但需要與某個額外的參考值比較,而不是常數;
  const,system:與某個常數比較,且只返回一行;
possiable_keys:查詢中可能會用到的索引;
key:查詢中使用的索引;
key_len:查詢中用到的索引長度;
ref:在利用key字段所顯示的索引完成查詢操作時所引用的列或常量值;
rows:MySQL估計出的為找到所有的目標項而需要讀取的行數;
Extra:額外信息
Using index:使用了覆蓋索引進行的查詢;
Using where:拿到數據后還要再次進行過濾;
Using temporary:使用了臨時表以完成查詢;
Using filesort:對結果使用了一個外部索引排序;

mysql高級

日志

  • 查詢日志:general_log
  • 慢查詢日志:log_slow_queries
  • 錯誤日志:log_error, log_warnings
  • 二進制日志:binlog
  • 中繼日志:relay_log
  • 事務日志:innodb_log

1、查詢日志

復制代碼
記錄查詢語句,日志存儲位置:FILE 表:table (mysql.general_log) general_log={ON|OFF} general_log_file=HOSTNAME.log log_output={FILE|TABLE|NONE}
復制代碼

2、慢查詢日志

復制代碼
慢查詢:運行時間超出指定時長的查詢; long_query_time 存儲位置:文件:FILE 表:TABLE,mysql.slog_log log_slow_queries={ON|OFF} slow_query_log={ON|OFF} slow_query_log_file= log_output={FILE|TABLE|NONE} log_slow_filter=admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk log_slow_rate_limit log_slow_verbosity
復制代碼

3、錯誤日志

復制代碼
記錄如下幾類信息: (1) mysqld啟動和關閉過程中輸出的信息; (2) mysqld運行中產生的錯誤信息; (3) event scheduler運行時產生的信息; (4) 主從復制架構中,從服務器復制線程啟動時產生的日志; log_error=
/var/log/mariadb/mariadb.log|OFF log_warnings={ON|OFF}
復制代碼

4、二進制日志

復制代碼
用於記錄引起數據改變或存在引起數據改變的潛在可能性的語句(STATEMENT)或改變后的結果(ROW),也可能是二者混合; 功用:“重放” binlog_format={STATEMENT|ROW|MIXED} STATEMENT:語句; ROW:行; MIXED:混編; 查看二進制日志文件列表: SHOW MASTER|BINARY LOGS; 查看當前正在使用的二進制日志文件: SHOW MASTER STATUS; 查看二進制 日志文件中的事件: SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count] 服務器變量: log_bin=/PATH/TO/BIN_LOG_FILE 只讀變量; session.sql_log_bin={ON|OFF} 控制某會話中的“寫”操作語句是否會被記錄於日志文件中; max_binlog_size=1073741824 sync_binlog={1|0}
復制代碼

查詢日志命令:
mysqlbinlog:
  YYYY-MM-DD hh:mm:ss
  --start-datetime=
  --stop-datetime=
  -j, --start-position=#
  --stop-position=#
  --user, --host, --password
二進制日志事件格式:

# at 553 #160831 9:56:08 server id 1 end_log_pos 624 Query thread_id=2 exec_time=0 error_code=0 SET TIMESTAMP=1472608568/*!*/; BEGIN /*!*/; 事件的起始位置:# at 553 事件發生的日期時間:#160831 9:56:08 事件發生的服務器id:server id 1 事件的結束位置:end_log_pos 624 事件的類型:Query 事件發生時所在服務器執行此事件的線程的ID: thread_id=2 語句的時間戳與將其寫入二進制日志文件中的時間差:exec_time=0 錯誤代碼:error_code=0 設定事件發生時的時間戳:SET TIMESTAMP=1472608568/*!*/; 事件內容:BEGIN
View Code

中繼日志:
從服務器上記錄下來從主服務器的二進制日志文件同步過來的事件;
事務日志:
事務型存儲引擎innodb用於保證事務特性的日志文件

MySQL:備份和恢復(數據)

時間點恢復:binary logs;
備份類型:
全量備份、增量備份、差異備份:
  完全備份
  增量備份:僅備份自上一次完全備份或 增量備份以來變量的那部數據;
  差異備份:僅備份自上一次完全備份以來變量的那部數據;
物理備份、邏輯備份:
  物理備份:復制數據文件進行的備份;
  邏輯備份:從數據庫導出數據另存在一個或多個文件中;
根據數據服務是否在線:
  熱備:讀寫操作均可進行的狀態下所做的備份;
  溫備:可讀但不可寫狀態下進行的備份;
  冷備:讀寫操作均不可進行的狀態下所做的備份;

備份策略:
全量+差異 + binlogs
全量+增量 + binlogs
備份手段:物理、邏輯

備份工具:
  mysqldump:mysql服務自帶的備份工具;邏輯備份工具;   完全、部分備份;
    InnoDB:熱備;
    MyISAM:溫備;
  cp/tar
  l  vm2:快照(請求一個全局鎖),之后立即釋放鎖,達到幾乎熱備的效果;物理備份;
    注意:不能僅備份數據文件;要同時備份事務日志;
    前提:要求數據文件和事務日志位於同一個邏輯卷;
  xtrabackup:由Percona提供,開源工具,支持對InnoDB做熱備,物理備份工具;
  mysqlhotcopy :(幾乎冷備,沒人用)
  select:
    備份:SELECT cluase INTO OUTFILE 'FILENAME';
    恢復:CREATE TABLE
    導入:LOAD DATA
InnoBase:Innodb --> XtraDB, Innobackup --> Xtrabackup

備份策略:
  xtrabackup:全量+差異+binlog 或全量+增量+binlog
  mysqldump:全量+binlog
mysqldump:

  Usage:   mysqldump [OPTIONS] database [tables] # 備份單庫,可以只備份其中的一部分表(部分備份);   OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...] # 備份多庫;   OR mysqldump [OPTIONS] --all-databases [OPTIONS] # 備份所有庫;   MyISAM存儲引擎:支持溫備,備份時要鎖定表;     -x, --lock-all-tables:鎖定所有庫的所有表,讀鎖;     -l, --lock-tables:鎖定指定庫所有表;   InnoDB存儲引擎:支持溫備和熱備;     --single-transaction:創建一個事務,基於此快照執行備份; 其它選項:   -R, --routines:備份指定庫的存儲過程和存儲函數;   --triggers:備份指定庫的觸發器;   -E, --events:
View Code

基於lvm2的備份:

前提:要求數據文件和事務日志位於同一個邏輯卷; (1) 請求鎖定所有表; mysql> FLUSH TABLES WITH READ LOCK; (2) 記錄二進制文件事件位置; mysql> FLUSH LOGS; mysql> SHOW MASTER STATUS; mysql -e 'SHOW MASTER STATUS;' >> /PATH/TO/SOME_POS_FILE (3) 創建快照卷 lvcreate -L # -s -p r - SNAM-NAME /dev/VG-NAME/LV-NAME (4) 釋放鎖 mysql> UNLOCK TABLES (5) 掛載快照卷,並執行備份,備份完成后刪除快照卷; (6) 周期性備份二進制日志;
View Code

Innobackup --> Xtrabackup
Xtrabackup:
  MyISAM:溫備,不支持增量備份;
  InnoDB:熱備,增量;
  物理備份,速率快、可靠;備份完成后自動校驗備份結果集是否可用;還原速度快;
  Usage: [innobackupex [--defaults-file=#] --backup | innobackupex [--defaults-file=#] --prepare] [OPTIONS]
  備份 --> 應用日志 --> 還原
  應用日志:--apply-log
  還原:--copy-back
完全備份:
  完全+binlog(總結):
  備份:innobackupex --user=    --password=   --host=    /PATH/TO/BACKUP_DIR
  准備:innobackupex   --apply-log    /PATH/TO/BACKUP_DIR
  恢復:innobackupex --copy-back
  注意:--copy-back需要在mysqld主機本地進行mysqld服務不能啟動;且innodb_log_file_size可能要重新設定;

MySQL Replication:

Master/Slave
  Master: write/read
  Slaves: read

配置:
主服務器:

  配置文件my.cnf   server_id=#   log_bin=log-bin   啟動服務:   mysql> GRANT REPLICATION   SLAVE, REPLICATION  CLIENT ON  *.* TO   'USERNAME'@'HOST'   IDENTIFIED  BY  'YOUR_PASSWORD';   mysql> FLUSH PRIVILEGES;
View Code

從服務器:  

配置文件my.cnf   server_id=#   relay_log=relay-log   read_only=ON   啟動服務:   mysql> CHANGE  MASTER TO     MASTER_HOST='HOST',   MASTER_USER='USERNAME' ,    MASTER_PASSWORD='YOUR_PASSWORD',     MASTER_LOG_FILE='BINLOG',MASTER_LOG_POS=#;   mysql> START SLAVE    [  IO_THREAD    | SQL_THREAD ];   mysql> SHOW SLAVE STATUS;
View Code

主主復制:互為主從:兩個節點各自都要開啟binlog和relay log;
1、數據不一致;
2、自動增長id;
定義一個節點使用奇數id
auto_increment_offset=1
auto_increment_increment=2
另一個節點使用偶數id
auto_increment_offset=2
auto_increment_increment=2
配置:
1、server_id必須要使用不同值;
2、均啟用binlog和relay log;
3、存在自動增長id的表,為了使得id不相沖突,需要定義其自動增長方式;
服務啟動后執行如下兩步:
4、都授權有復制權限的用戶賬號;
5、各把對方指定為主節點;

復制時應該注意的問題:
1、從服務設定為“只讀”;
在從服務器啟動read_only,但僅對非SUPER權限的用戶有效;
阻止所有用戶:
mysql> FLUSH TABLES WITH READ LOCK;
2、盡量確保復制時的事務安全
在master節點啟用參數:
sync_binlog = ON
如果用到的是InnoDB存儲引擎:
innodb_flush_logs_at_trx_commit=ON
innodb_support_xa=ON
3、從服務器意外中止時盡量避免自動啟動復制線程
4、從節點:設置參數
sync_master_info=ON
sync_relay_log_info=ON

半同步復制
支持多種插件:/usr/lib64/mysql/plugins/
需要安裝方可使用:
mysql> INSTALL PLUGIN   plugin_name   SONAME   'shared_library_name'; 

半同步復制:semisync_master.so,semisync_slave.so
主節點:

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master'; MariaDB [mydb]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%'; +------------------------------------+-------+
| Variable_name | Value |
+------------------------------------+-------+
| rpl_semi_sync_master_enabled | OFF |
| rpl_semi_sync_master_timeout | 10000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_no_slave | ON |
+------------------------------------+-------+ MariaDB [mydb]> SET GLOBAL rpl_semi_sync_master_enabled=ON;    
View Code

從節點:

INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; MariaDB [mydb]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%'; +---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled | OFF |
| rpl_semi_sync_slave_trace_level | 32 |
+---------------------------------+-------+ MariaDB [mydb]> STOP SLAVE IO_THREAD; MariaDB [mydb]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%'; MariaDB [mydb]> START SLAVE IO_THREAD,SQL_THREAD;
View Code

SHOW GLOBAL VARIABLES  LIKE '%rpl%';

SHOW GLOBAL STATUS LIKE '%rpl%';

mysql優化

mysql復制過濾器與監控維護

僅復制有限一個或幾個數據庫相關的數據,而非所有;由復制過濾器進行;
有兩種實現思路:
(1) 主服務器

主服務器僅向二進制日志中記錄有關特定數據庫相關的寫操作; 問題:其它庫的time-point recovery將無從實現; binlog_do_db= binlog_ignore_db=
View Code

(2) 從服務器

從服務器的SQL THREAD僅重放關注的數據庫或表相關的事件,並將其應用於本地; 問題:網絡IO和磁盤IO; Replicate_Do_DB= Replicate_Ignore_DB= Replicate_Do_Table= Replicate_Ignore_Table= Replicate_Wild_Do_Table= Replicate_Wild_Ignore_Table=    
View Code

復制的監控和維護:
(1) 清理日志:PURGE
PURGE    { BINARY | MASTER }   LOGS   { TO   'log_name' | BEFORE datetime_expr };
(2) 復制監控
MASTER:  SHOW MASTER STATUS;  SHOW BINLOG EVENTS;  SHOW BINARY LOGS;
SLAVE:   SHOW SLAVE STATUS;  

(3) 確定主從節點數據是否一致,通過表的CHECKSUM檢查,使用percona-tools中pt-table-checksum;
(4) 主從數據不一致時的修復方法:重新復制;

主從復制的讀寫分離

主從復制的讀寫分離:
ProxySQL
http://www.proxysql.com/, ProxySQL is a high performance, high availability, protocol aware proxy for MySQL and forks (like Percona Server and MariaDB).
https://github.com/sysown/proxysql/releases

ProxySQL配置示例:

datadir="/var/lib/proxysql" admin_variables= { admin_credentials="admin:admin" mysql_ifaces="127.0.0.1:6032;/tmp/proxysql_admin.sock" } mysql_variables= { threads=4 max_connections=2048 default_query_delay=0 default_query_timeout=36000000 have_compress=true poll_timeout=2000 interfaces="0.0.0.0:3306;/tmp/mysql.sock" default_schema="information_schema" stacksize=1048576 server_version="5.5.30" connect_timeout_server=3000 monitor_history=600000 monitor_connect_interval=60000 monitor_ping_interval=10000 monitor_read_only_interval=1500 monitor_read_only_timeout=500 ping_interval_server=120000 ping_timeout_server=500 commands_stats=true sessions_sort=true connect_retries_on_failure=10 } mysql_servers = ( { address = "172.18.64.7" # no default, required . If port is 0 , address is interpred as a Unix Socket Domain port = 3306 # no default, required . If port is 0 , address is interpred as a Unix Socket Domain hostgroup = 0 # no default, required status = "ONLINE" # default: ONLINE weight = 1 # default: 1 compression = 0 # default: 0 }, { address = "172.18.64.107" port = 3306 hostgroup = 1 status = "ONLINE" # default: ONLINE weight = 1 # default: 1 compression = 0 # default: 0 }, { address = "172.18.64.106" port = 3306 hostgroup = 1 status = "ONLINE" # default: ONLINE weight = 1 # default: 1 compression = 0 # default: 0 } ) mysql_users: ( { username = "heiye" password = "centos" default_hostgroup = 0 max_connections=1000 default_schema="mydb" active = 1 } ) mysql_query_rules: ( ) scheduler= ( ) mysql_replication_hostgroups= ( { writer_hostgroup=0 reader_hostgroup=1 } )
View Code

maxscale配置示例:

[maxscale] threads=auto [server1] type=server address=172.18.64.7 port=3306 protocol=MySQLBackend [server2] type=server address=172.18.64.107 port=3306 protocol=MySQLBackend [server3] type=server address=172.18.64.106 port=3306 protocol=MySQLBackend [MySQL Monitor] type=monitor module=mysqlmon servers=server1,server2,server3 user=maxscale passwd=201221DC8FC5A49EA50F417A939A1302 monitor_interval=1000 [Read-Only Service] type=service router=readconnroute servers=server2,server3 user=maxscale passwd=201221DC8FC5A49EA50F417A939A1302 router_options=slave [Read-Write Service] type=service router=readwritesplit servers=server1 user=maxscale passwd=201221DC8FC5A49EA50F417A939A1302 max_slave_connections=100% [MaxAdmin Service] type=service router=cli [Read-Only Listener] type=listener service=Read-Only Service protocol=MySQLClient port=4008 [Read-Write Listener] type=listener service=Read-Write Service protocol=MySQLClient port=4006 [MaxAdmin Listener] type=listener service=MaxAdmin Service protocol=maxscaled port=6602
View Code

mysql常用優化參數

InnoDB存儲引擎相關的參數:
  innodb_buffer_pool_size:索引、數據、插入數據時的緩沖區,一般為專用服務器70-80%;
  如果數據集本身較小,可根據數據變化幅度及規划的時長也設定合理值,比預估的目標值略大;
  innodb_buffer_pool_instances: buffer_pool的區段(實例)數量;

  innodb_file_per_table:innodb的諸多高級特性都依賴於此參數;
  innodb_read_io_threads: 
  innodb_write_io_threads
  文件讀寫的io線程數;可根據並發量和CPU核心數適當調整;
  innodb_open_files:innodb可打開的文件數量上限;

  innodb_flush_method:
  innodb_thread_concurrency=
  skip_name_resolve =  ON
  max_connections 

事務日志:    
  innodb_log_files_in_group:一組的日志文件數量,至少2個;
  innodb_log_file_size:日志文件大小,默認為5M;建議調大此值;
  innodb_flush_logs_at_trx_commit:
    0:log buffer(內存)每秒一次同步到log file中,且同時會進行log file到data file的同步操作;
    1:每次提交時,log buffer同步到log file,同時進行log file到data file的同步操作;
    2:每次提交時,log buffer同步到log file,但不會同時進行log file到data file的同步操作;
  建議:關閉autocommit,而后將此值設置為1或2;




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM