現在互聯網行業用的最多就是 MySQL,然而對於高級 Web 面試者,尤爲對於尋找 30k 下工做的求職者,不少 MySQL 相關知識點基本都會涉及,若是面試中,你的相關知識答的模糊和不切要點,基本大多稍好公司的面試官,基本也不會對你有興趣,畢竟稍微量大的項目,最終都會讓你去深刻數據庫,並且最終的大多瓶頸首先也會出如今數據庫。mysql
磁盤文件--> 層次模型 --> 網狀模型 --> (Codd) 關係模型 DBMS是管理數據庫的系統軟件,它實現數據庫系統的各類功 能。是數據庫系統的核心git
DBA:負責數據庫的規劃、設計、協調、維護和管理等工做github
關係 :關係就是二維表。並知足以下性質: 表中的行、列次序並不重要面試
行row:表中的每一行,又稱爲一條記錄正則表達式
列column:表中的每一列,稱爲屬性,字段sql
主鍵(Primary key):用於唯一肯定一個記錄的字段;複合主鍵:多個字段組合成一個主鍵(NOT NULL);數據庫
唯一鍵:一個或多個字段的組合,填入的數據必須能在本表 中惟一標識本行;容許爲NULL,一個表能夠存在多個緩存
主鍵約束:唯1、非空;一張表只能有一個; 唯一鍵約束:唯一,能夠存在多個; 外鍵約束:參考性約束; 檢查性約束: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-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
-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 禁止主機名解析
在數據庫系統中,SQL語句不區分大小寫(建議用大寫) ,但字符串常量區分大小寫
SQL語句可單行或多行書寫,以「;」結尾,關鍵詞不能跨多行或簡寫
用空格和縮進來提升語句的可讀性 ,句一般位於獨立行,便於編輯,提升可讀性
註釋: SQL標準: /註釋內容/ 多行註釋 -- 註釋內容 單行註釋,注意有空格
數據庫對象的命名規則 :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
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 例:
操做符: >, <, >=, <=, ==, != , 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
建立用戶: 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生效
刪除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進程;
權限級別:管理權限、數據庫、表、字段、存儲例程
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表上執行
一、以ClassID分組,顯示每班的同窗的人數; SELECT ClassID,count(StuID) FROM students GROUP BY ClassID;
二、以Gender分組,顯示其年齡之和; SELECT Gender,SUM(Age) FROM students GROUP BY Gender;
三、以ClassID分組,顯示其平均年齡大於25的班級; SELECT ClassID,avg(age) FROM students GROUP BY ClassID HAVING avg(Age) > 25;
四、以Gender分組,顯示各組中年齡大於25的學員的年齡之和;
練習:導入hellodb.sql,完成如下題目:
一、顯示前5位同窗的姓名、課程及成績; 二、顯示其成績高於80的同窗的名稱及課程; 三、求前8位同窗每位同窗本身兩門課的平均成績,並按降序排列; 四、顯示每門課程課程名稱及學習了這門課的同窗的個數;
思考: 一、如何顯示其年齡大於平均年齡的同窗的名字? 二、如何顯示其學習的課程爲第一、2,4或第7門課的同窗的名字? 三、如何顯示其成員數最少爲3個的班級的同窗中年齡大於同班同窗平均年齡的同窗? 四、統計各班級中年齡大於全校同窗平均年齡的同窗。
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服務器上表的存儲引擎接口;
事務:一組原子性的SQL查詢、或者是一個或多個SQL語句組成的獨立工做單元;
innodb_log_files_in_group innodb_log_group_home_dir innodb_log_file_size innodb_mirrored_log_groups
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] ..
索引:提取索引的建立在的表上字段中的數據,構建出一個獨特的數據結構; 索引的做用:加速查詢操做;反作用:下降寫操做性能; 表中數據子集:把表中某個或某些字段的數據提取出來另存爲一個特定數據結構組織的數據; 某個字段或某些字段: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%';
若是查詢條件不是從最左側列開始,索引無效; 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_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:對結果使用了一個外部索引排序;
查詢日誌:general_log
慢查詢日誌:log_slow_queries
錯誤日誌:log_error, log_warnings
二進制日誌:binlog
中繼日誌:relay_log
事務日誌:innodb_log
記錄查詢語句,日誌存儲位置:FILE
表:table (mysql.general_log) general_log={ON|OFF} general_log_file=HOSTNAME.log log_output={FILE|TABLE|NONE}複製代碼
慢查詢:運行時間超出指定時長的查詢; 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複製代碼
記錄以下幾類信息: (1) mysqld啓動和關閉過程當中輸出的信息; (2) mysqld運行中產生的錯誤信息; (3) event scheduler運行時產生的信息; (4) 主從複製架構中,從服務器複製線程啓動時產生的日誌;
log_error= /var/log/mariadb/mariadb.log|OFF log_warnings={ON|OFF}複製代碼
用於記錄引發數據改變或存在引發數據改變的潛在可能性的語句(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 二進制日誌事件格式:
View Code
從服務器上記錄下來從主服務器的二進制日誌文件同步過來的事件; 事務日誌: 事務型存儲引擎innodb用於保證事務特性的日誌文件
時間點恢復: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:
View Code
基於lvm2的備份:
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可能要從新設定;
Master/Slave Master: write/read Slaves: read
配置: 主服務器:
View Code
從服務器:
View Code
**主主複製:**互爲主從:兩個節點各自都要開啓binlog和relay log; 一、數據不一致; 二、自動增加id; 定義一個節點使用奇數id auto_increment_offset=1 auto_increment_increment=2 另外一個節點使用偶數id auto_increment_offset=2 auto_increment_increment=2 配置: 一、server_id必需要使用不一樣值; 二、均啓用binlog和relay log; 三、存在自動增加id的表,爲了使得id不相沖突,須要定義其自動增加方式; 服務啓動後執行以下兩步: 四、都受權有複製權限的用戶帳號; 五、各把對方指定爲主節點;
複製時應該注意的問題: 一、從服務設定爲「只讀」; 在從服務器啓動read_only,但僅對非SUPER權限的用戶有效; 阻止全部用戶: mysql> FLUSH TABLES WITH READ LOCK; 二、儘可能確保複製時的事務安全 在master節點啓用參數: sync_binlog = ON 若是用到的是InnoDB存儲引擎: innodb_flush_logs_at_trx_commit=ON innodb_support_xa=ON 三、從服務器意外停止時儘可能避免自動啓動複製線程 四、從節點:設置參數 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 主節點:
View Code
從節點:
View Code
SHOW GLOBAL VARIABLES LIKE ‘%rpl%’;
SHOW GLOBAL STATUS LIKE ‘%rpl%’;
僅複製有限一個或幾個數據庫相關的數據,而非全部;由複製過濾器進行; 有兩種實現思路: (1) 主服務器
View Code
(2) 從服務器
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 www.proxysql.com/, ProxySQL is a high performance, high availability, protocol aware proxy for MySQL and forks (like Percona Server and MariaDB). github.com/sysown/prox…
ProxySQL配置示例:
View Code
maxscale配置示例:
View Code
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;
多多學習加油!!!