MySQL運維命令大全
關系型數據庫
DML: Data Manapulate Lanauage 數據操作語言
INSERT, REPALCE, UPDATE, DELETE
DDL: Data Definition Lanauage 數據定義語言
CREATE, ALTER, DROP
DCL: Data Control Lanauage 數據控制語言
GRANT,REVOKE
DBMS:
數據管理的獨立性
有效的完成數據的存取
數據完整性和安全性
數據集中管理
並發存儲與故障恢復
減少應用程序的開發時間
RDBS擁有的組件:
緩存器
故障恢復器
磁盤空間管理器
事務管理器
鎖管理器
SQL分析器
SQL優化器
SQL計劃執行器
mysql
-u USERNAME
-p PASSWD
-h DOMAIN
mysql客戶端:
交互式模式
批處理模式(執行mysql腳本)
交互式模式中的命令類別:
客戶端命令
服務器端命令
關系數據庫對象
表
索引
視圖
約束
存儲過程
存儲函數
觸發器(主動數據庫)
遊標
用戶
權限
事務
表
行,列
表:實體
列:field,column
行:raw
字段名稱
字符
CHAR(n)
VARCHAR(n)
BINARY(n):區分大小寫
VARBINARY(n)
TEXT(n)
BLOB(n)
數值
精確數值型
整型
TINYINT
SMALLINT
MEDIUMINT
INT
BIGINT
修飾符: UNSIGNED
NOT NULL
十進制
DECIMAL
近似數值型
浮點型
FLOAT
DOUBLE
日期時間
DATA
TIME
DATETIME
STAMP
布爾
內置:ENUM, SET
DDL
CREATE
ALTER
DROP
DML
INSERT
UPDATE
DELETE
DCL
GRANT
REVOKE
創建數據庫
CREATE DATABASE db_name;
CREATE DATABASE [IF NOT EXISTS] db_name;
DROP DATABASE [IF EXISTS] db_name;
創建表
CREATE TABLE tb_name(col1,col2,...);
create:
create table TABLE_NAME (
Id int NOT NULL,
Name char(10),
Age int,
Sex char(5)
);
查看庫中的表:SHOW TABLES FROM db_name;
查看表的結構:DESC tb_name;
刪除表:DROP TABLE tb_name;
修改表:
ALTER TABLE tb_name
MODIFY mysql> ALTER TABLE t1 MODIFY b BIGINT NOT NULL;
CHANGE mysql> ALTER TABLE t1 CHANGE a b INTEGER;
ADD
DROP
DML:
INSERT INTO tb_name (col1,col2,...) VALUES|VALUE (‘STRING‘, NUM,...);
INSERT INTO tb_name (col1,col2,...) VALUES|VALUE (‘STRING‘, NUM,...),(‘STRING‘,NUM,...);
UPDATE tb_name SET column=value WHERE
DELETE FROM tb_name WHERE CONDITION;
選擇:
SELECT 字段 FROM tb_name WHERE CONDITION
*: 所有字段
WHERE:沒有條件表示顯示所有行;
創建用戶:
CREATE USER [email protected] [IDENTIFIED BY ‘PASSWORD‘];
DROP USER [email protected];
HOST:
IP:
HOSTNAME:
NETWORK:
通配符
_:匹配任意單個字符, 172.16.0._
%:匹配任意字符;
[email protected]%‘
DCL:
GRANT pri1,pri2,... ON DB_NAME.TB_NAME TO [email protected] [IDENTIFIED BY ‘PASSWORD‘];
REVOKE pri1,pri2,... ON DB_NAME.TB_NAME FROM [email protected];
查看用戶的授權:SHOW GRANTS FOR [email protected];
ALL PRIVILEGES
關系型數據
表示層:表
邏輯層:存儲引擎
物理層:數據文件
數據查詢和存儲
存儲管理器:
權限及完整性管理器
事物管理器
文件管理器
緩沖區管理器
查詢管理器:
DML解釋器
DCL解釋器
DDL解釋器
查詢執行引擎
smp:對稱多處理器
MySQL插件式存儲引擎
5.5.8之前:MyISAM(不支持事務,適用於查詢多,增刪少)
5.5.8之後:InnoDB(支持事物,適用於增刪比較多)
文件中記錄組織:
堆文件組織:一條記錄可以放在任何地方
順序文件組織:根據“搜索碼”值順序存放
散列文件組織:分成N個片
表結構定義文件,表數據文件
表空間:實現一個表放多個表的數據(table space)
數據字典:
關系的元數據:
關系的名字、字段的名字、字段的類型和長度、視圖、約束
緩沖區管理器:
緩存置換策略
被釘住的塊:不允許置換出去
Root user password assignment
1,#mysqladmin -u USERNAME -h HOSTNAME password ‘NEW_TION;PASS‘ -p(輸入舊密碼)
2,mysql> SET PASSWORD FOR [email protected]=PASSWORD(‘new_passwd‘);
3,mysql> UPDATE mysql.user SET PASSWORD=PASSWORD(‘new_passwd‘) WHERE CONDITION;
mysql客戶端工具
mysql
mysqladmin
mysqldump
mysqlcheck
mysqlimport
可以在用戶家目錄建立my.cnf
[client]
user = ‘root‘
password = ‘redhat‘
host = localhost
mysql非客戶端工具
myisamchk
myisampack
存儲引擎:
MyISAM:不支持事務,只支持表鎖,不支持外鍵,並發寫不好,支持B樹索引、FULLTEXT索引、空間索引,支持表壓縮
每表三個文件:
.frm:表結構
.MYD:表數據
.MYI:表索引
InnoDB:支持事務,行級別的鎖,支持B樹索引、聚簇索引、自適應hash索引,表空間,支持raw(裸設備)磁盤
默認所有表數據共享一個表空間,可以編輯/etc/my.cnf永久話化
SHOW VARIABLES LIKE ‘%innodb‘中找到innodb_file_per_table
.frm:表結構
.ibd:表空間
.opt:默認字符集和排序規則選項
MRG_MYISAM:支持兩個表邏輯上的合並
CSV:兩個數據庫移植的時候使用
ARCHIVE:用於實現歸檔,用於做數據挖掘,不再修改
MEMORY:用於創建臨時表,存儲在內存中
mysql
--user, -u
--host, -h
--password, -p
--port
--protocol
--database DATABASE, -D
mysql>
交互模式
批處理模式(執行mysql腳本)
mysql -uroot -p‘redhat‘ < test.sql
或
mysql> source test.sql
客戶端命令:
\c:提前終止語句的執行
\g:無論語句結束符是什麽,直接執行
\d:自定義結束符是什麽
\G:豎排顯示
\W:顯示警告信息
\#: 新建對象field自動補全
AUTO_INCREMENT
整型
非空
無符號
主鍵或唯一
Mysql服務器變量
全局變量:對當前會話無效,只對新會話生效
mysql> SHOW GLOBAL VARIABLES
會話變量:及時生效,只對當前會話有效
mysql> SHOW [SESSION] VARIABLES
生效時間:
動態--臨時修改
靜態--寫在配置文件,通過參數傳遞給mysqld
mysql> SHOW TABLE STATUS LIKE ‘students‘\G;
mysql> SHOW CHARACTER SET;(查看字符集)
mysql> SHOW INDEXES FROM ‘students‘;(查看表上的索引)
mysql> SHOW COLLATION;(查看字符集)
mysql> SHOW GLOBAL VARIABLES LIKE ‘%char%‘;(查看變量)
mysql> SELECT LAST_INSERT_ID();
mysql> SELECT DATABASE();
查看服務器變量 :@@變量名
mysql> SELECT @@global.sql_mode; 或 mysql> SHOW GLOBAL VARIABLES LIKE ‘sql_mode‘;
mysql> SELECT @@session.sql_mode; 或 mysql> SHOW SESSION LIKE ‘sql_mode‘;
設定服務器變量:SET GLOBAL|SESSION 變量名=‘value‘
SQL語句:
mysql> SHOW COLLATION LIKE ‘%gbk%‘;
mysql> CREATE SCHEMA IF NOT EXISTS students CHARACTER SET ‘gbk‘ COLLATION ‘gbk_chinese_ci‘
選擇:SELECT * FROM tb_name WHERE
布爾表達式
算術運算:
比較操作符:
其它運算符:IN, BETWEEN ... AND ..., LIKE, RLIKE(REGEXP), IS NULL, IS NOT NULL
邏輯運算:AND, OR, NOT, XOR
DISTINCT
投影:SELECT field1, ... FROM tb_name;
ORDER BY field,... {ASC|DESC}
聚合計算:COUNT()、SUM()、MAX()、MIN()和AVG();
GROUP BY field1,...
HAVING
LIMIT [offset],num
多表查詢:
交叉連接
自然連接
WHERE tb1.field=tb2.field
外連接
左外
FROM tb1 LEFT JOIN tb2 ON condition
右外
FROM tb1 RIGHT JOIN tb2 ON condtion
自連接
子查詢:
FROM
WHERE
比較操作符:子查詢只能返回一個字段的單值;
IN:列表(某字段的多個值)
廣義查詢:
DML:
DELETE
INSERT INTO
UPDATE
INSERT INTO tb_name (col1, col2, ...) VALUES (val1, val2, ...)[,(val1, val2, ...),...]
字符型:單引號
數值型:不需要引號
日期時間型:
空值:NULL, ‘‘
INSERT三種:
INSERT INTO tutors (Tname,Gender,Age) VALUES (‘Joe‘,‘M‘,28);
INSERT INTO tutors SET Tname=‘Tom‘,Gender=‘F‘,Age=30;
INSERT INTO tutors (Tname,Gender,Age) SELECT Name,Gender,Age FROM students WHERE Age>20;
REPLACE INTO
REPLACE INTO tutors (Tname,Gender,Age) VALUES (‘Joe‘,‘M‘,28);
REPLACE INTO tutors SET Tname=‘Tom‘,Gender=‘F‘,Age=30;
REPLACE INTO tutors (Tname,Gender,Age) SELECT Name,Gender,Age FROM students WHERE Age>20;
DELETE:
DELETE FROM tb_name WHERE condition;
TRUNCATE tb_name: 清空表,並重置AUTOINCREMENT計數器;
UPDATE tb_name SET col1=..., col2=... WHERE
鎖:
讀鎖:共享鎖
寫鎖:獨占鎖
LOCK TABLES tb_name {READ|WRITE}
UNLOCK TABLES
鎖粒度:從大到小,Mysql服務器僅支持表級鎖,行鎖需要由存儲引擎支持
表鎖:整張表
頁鎖:鎖定一個數據塊,劃分的DATA BLOCK
行鎖:一個實體,元組
Mysql的事務(ACID測試):
原子性(Atomicity) :事務引起的操作,要麽都完成,要麽都不執行。
一致性(Consistency):寫入的事務和處理後的數據在完成之前和完成之後應當一致
隔離性(Isolation) :如果兩個事物同時執行,不能互相影響。MVCC:多版本並發控制
持久性(Durability) :出現崩潰,要可以恢復,保持在磁盤的數據應持久
日誌中存儲的操作過程,而非數據本身
隔離級別(隔離級別越高,並發越差):
READ-UNCOMMITTED:讀未提交。只要第一個事務操作,即使未提交,第二個也可以立刻就可以看到。
READ-COMMITTED :讀提交。同上,會產生"幻讀"
REPEATABLE-READ :可重讀。無論提交與否,截止事務提交之前都不變。
SERIABLIZABLE :可串行。一個事務一個事務排隊來。
查看隔離級別:mysql> SHOW GLOBAL VARIABLES LIKE ‘%iso%‘;
修改隔離級別:mysql> SET SESSION tx_isolation=‘READ-UNCOMMITTED‘;
再查看隔離級別:mysql> SELECT @@tx_isolation;
事務:CPU, I/O
RDBMS,
ACID:
Automicity:原子性,事務所引起的數據庫操作,要麽都完成,要麽都不執行;
Consistency:一致性,A(3000)-->B(2000)
1:A:3000-->2500,
2: A+B: 4500,
Isolation: 隔離性
事務調度:事務之間影響最小
MVCC:多版本並發控制
Durability:一旦事務成功完成,系統必須保證任何故障都不會引起事務表示出不一致性;
1、事務提交之前就已經寫出數據至持久性存儲;
2、結合事務日誌完成;
事務日誌:順序IO
數據文件:隨機IO
事務的狀態:
活動的:active
部分提交的:最後一條語句執行後
失敗的:提交後未能完成
中止的:沒提交,走了一半就提前停止
提交的:
事務:並發執行
1、提高吞吐量和資源利用率
2、減少等待時間
事務調度:
可恢復調度;
無級聯高度:
mysql> START TRANSACTION;(啟動事務)
mysql> DELETE FROM tutors WHERE Tname LIKE ‘stu%‘
mysql> ROLLBACK;(回滾delete操作)
mysql> COMMIT;(事務提交之後不可以撤銷)
查看是否自動提交(建議關閉自動提交,減少I/O操作):
mysql> SELECT @@autocommit
記錄/回滾事務保存點
mysql> SAVEPOINT pointA;
mysql> ROLLBACK TO pointA;
=============================================================================================
Mysql用戶權限管
user: Contains user accounts, global privileges, and other non-privilege columns.
user: 用戶帳號、全局權限
db: Contains database-level privileges.
db: 庫級別權限
host: Obsolete.
host: 廢棄
tables_priv: Contains table-level privileges.
表級別權限
columns_priv: Contains column-level privileges.
列級別權限
procs_priv: Contains stored procedure and function privileges.
存儲過程和存儲函數相關的權限
proxies_priv: Contains proxy-user privileges.
代理用戶權限
權限級別:
全局級別: SUPER、
庫
表: DELETE, ALTER, TRIGGER
列: SELECT, INSERT, UPDATE
存儲過程和存儲函數
=============================================================================================
Mysql日誌類型
錯誤日誌:服務器啟動和關閉、服務器運行過程中的錯誤信息、事物調度器運行一個事件時產生的信息、在從服務器上啟動從服務的日誌
log_error
log_warnings
一般查詢日誌:DML、DDL
general_log
general_log_file
log
log_output
慢查詢日誌
long_query_time
log_slow_queries={YES|NO}
slow_query_log
slow_query_log_file
二進制日誌:任何引起或可能引起數據庫變化的操作;
復制、即時點恢復;
mysqlbinlog
二進制日誌的格式(binlog_format):
基於語句: statement
基於行: row
混合方式: mixed
二進制日誌事件:
產生的時間
相對位置
二進制日誌文件:
索引文件
二進制日誌文件
查找關於log的參數
mysql> SHOW GLOBAL VARIABLES LIKE ‘%log%‘
查看二進制日誌的信息
mysql> SHOW BINLOG EVENTS IN ‘二進制日誌文件名‘ [FROM pos];
mysql> SHOW BINLOG EVENTS IN ‘mysql-bin.000005‘ [FROM 107];
查看當前正在使用的二進制日誌文件
mysql> SHOW MASTER STATUS;
查看當前擁有的二進制文件
mysql> SHOW BINARY LOGS;
刪除二進制日誌
mysql> PURGE BINARY LOGS TO ‘某二進制日誌文件‘
滾動二進制日誌
mysql>FLUSH LOGS;
利用mysqlbinlog查看日誌和導出
root# mysqlbinlog --start-position=177 --stop-position=358 mysql-bin.000005
root# mysqlbinlog --start-datetime=‘2017-04-09 15:14:39‘ [--stop-datetime] mysql-bin.000005
root# mysqlbinlog --start-datetime=‘2017-04-09 15:14:39‘ [--stop-datetime] mysql-bin.000005 > /root/back.sql
中繼日誌:
從主服務器的二進制日誌文件中復制而來的時間,並保存為的日誌文件
事務日誌:ACID,將隨機IO轉換為順序IO;
事務性存儲引擎用於保證保證原子性、一致性、隔離性和持久性
innodb_flush_log_at_trx_commit:
0:每秒同步,並執行磁盤flush操作
1:每事務同步,並執行磁盤flush操作(推薦)
2:每事務同步,但不執行磁盤flush操作,有操作系統決定flush
expire_logs_days={0..99}
設定二進制日誌的過期天數,超出此天數的二進制日誌文件將被自動刪除。默認為0,表示不啟用過期自動刪除功能。如果啟用此功能,自動刪除工作通常發生在MySQL啟動時或FLUSH日誌時。作用範圍為全局,可用於配置文件,屬動態變量。
general_log={ON|OFF}
設定是否啟用查詢日誌,默認值為取決於在啟動mysqld時是否使用了--general_log選項。如若啟用此項,其輸出位置則由--log_output選項進行定義,如果log_output的值設定為NONE,即使用啟用查詢日誌,其也不會記錄任何日誌信息。作用範圍為全局,可用於配置文件,屬動態變量。
general_log_file=FILE_NAME
查詢日誌的日誌文件名稱,默認為“hostname.log"。作用範圍為全局,可用於配置文件,屬動態變量。
binlog-format={ROW|STATEMENT|MIXED}
指定二進制日誌的類型,默認為STATEMENT。如果設定了二進制日誌的格式,卻沒有啟用二進制日誌,則MySQL啟動時會產生警告日誌信息並記錄於錯誤日誌中。作用範圍為全局或會話,可用於配置文件,且屬於動態變量。
log={YES|NO}
是否啟用記錄所有語句的日誌信息於一般查詢日誌(general query log)中,默認通常為OFF。MySQL 5.6已經棄用此選項。
log-bin={YES|NO}
是否啟用二進制日誌,如果為mysqld設定了--log-bin選項,則其值為ON,否則則為OFF。其僅用於顯示是否啟用了二進制日誌,並不反應log-bin的設定值。作用範圍為全局級別,屬非動態變量。
log_bin_trust_function_creators={TRUE|FALSE}
此參數僅在啟用二進制日誌時有效,用於控制創建存儲函數時如果會導致不安全的事件記錄二進制日誌條件下是否禁止創建存儲函數。默認值為0,表示除非用戶除了CREATE ROUTING或ALTER ROUTINE權限外還有SUPER權限,否則將禁止創建或修改存儲函數,同時,還要求在創建函數時必需為之使用DETERMINISTIC屬性,再不然就是附帶READS SQL DATA或NO SQL屬性。設置其值為1時則不啟用這些限制。作用範圍為全局級別,可用於配置文件,屬動態變量。
log_error=/PATH/TO/ERROR_LOG_FILENAME
定義錯誤日誌文件。作用範圍為全局或會話級別,可用於配置文件,屬非動態變量。
log_output={TABLE|FILE|NONE}
定義一般查詢日誌和慢查詢日誌的保存方式,可以是TABLE、FILE、NONE,也可以是TABLE及FILE的組合(用逗號隔開),默認為TABLE。如果組合中出現了NONE,那麽其它設定都將失效,同時,無論是否啟用日誌功能,也不會記錄任何相關的日誌信息。作用範圍為全局級別,可用於配置文件,屬動態變量。
log_query_not_using_indexes={ON|OFF}
設定是否將沒有使用索引的查詢操作記錄到慢查詢日誌。作用範圍為全局級別,可用於配置文件,屬動態變量。
log_slave_updates
用於設定復制場景中的從服務器是否將從主服務器收到的更新操作記錄進本機的二進制日誌中。本參數設定的生效需要在從服務器上啟用二進制日誌功能。
log_slow_queries={YES|NO}
是否記錄慢查詢日誌。慢查詢是指查詢的執行時間超出long_query_time參數所設定時長的事件。MySQL 5.6將此參數修改為了slow_query_log。作用範圍為全局級別,可用於配置文件,屬動態變量。
log_warnings=#
設定是否將警告信息記錄進錯誤日誌。默認設定為1,表示啟用;可以將其設置為0以禁用;而其值為大於1的數值時表示將新發起連接時產生的“失敗的連接”和“拒絕訪問”類的錯誤信息也記錄進錯誤日誌。
long_query_time=#
設定區別慢查詢與一般查詢的語句執行時間長度。這裏的語句執行時長為實際的執行時間,而非在CPU上的執行時長,因此,負載較重的服務器上更容易產生慢查詢。其最小值為0,默認值為10,單位是秒鐘。它也支持毫秒級的解析度。作用範圍為全局或會話級別,可用於配置文件,屬動態變量。
max_binlog_cache_size{4096 .. 18446744073709547520}
二進定日誌緩存空間大小,5.5.9及以後的版本僅應用於事務緩存,其上限由max_binlog_stmt_cache_size決定。作用範圍為全局級別,可用於配置文件,屬動態變量。
max_binlog_size={4096 .. 1073741824}
設定二進制日誌文件上限,單位為字節,最小值為4K,最大值為1G,默認為1G。某事務所產生的日誌信息只能寫入一個二進制日誌文件,因此,實際上的二進制日誌文件可能大於這個指定的上限。作用範圍為全局級別,可用於配置文件,屬動態變量。
max_relay_log_size={4096..1073741824}
設定從服務器上中繼日誌的體積上限,到達此限度時其會自動進行中繼日誌滾動。此參數值為0時,mysqld將使用max_binlog_size參數同時為二進制日誌和中繼日誌設定日誌文件體積上限。作用範圍為全局級別,可用於配置文件,屬動態變量。
innodb_log_buffer_size={262144 .. 4294967295}
設定InnoDB用於輔助完成日誌文件寫操作的日誌緩沖區大小,單位是字節,默認為8MB。較大的事務可以借助於更大的日誌緩沖區來避免在事務完成之前將日誌緩沖區的數據寫入日誌文件,以減少I/O操作進而提升系統性能。因此,在有著較大事務的應用場景中,建議為此變量設定一個更大的值。作用範圍為全局級別,可用於選項文件,屬非動態變量。
innodb_log_file_size={108576 .. 4294967295}
設定日誌組中每個日誌文件的大小,單位是字節,默認值是5MB。較為明智的取值範圍是從1MB到緩存池體積的1/n,其中n表示日誌組中日誌文件的個數。日誌文件越大,在緩存池中需要執行的檢查點刷寫操作就越少,這意味著所需的I/O操作也就越少,然而這也會導致較慢的故障恢復速度。作用範圍為全局級別,可用於選項文件,屬非動態變量。
innodb_log_files_in_group={2 .. 100}
設定日誌組中日誌文件的個數。InnoDB以循環的方式使用這些日誌文件。默認值為2。作用範圍為全局級別,可用於選項文件,屬非動態變量。
innodb_log_group_home_dir=/PATH/TO/DIR
設定InnoDB重做日誌文件的存儲目錄。在缺省使用InnoDB日誌相關的所有變量時,其默認會在數據目錄中創建兩個大小為5MB的名為ib_logfile0和ib_logfile1的日誌文件。作用範圍為全局級別,可用於選項文件,屬非動態變量。
relay_log=file_name
設定中繼日誌的文件名稱,默認為host_name-relay-bin。也可以使用絕對路徑,以指定非數據目錄來存儲中繼日誌。作用範圍為全局級別,可用於選項文件,屬非動態變量。
relay_log_index=file_name
設定中繼日誌的索引文件名,默認為為數據目錄中的host_name-relay-bin.index。作用範圍為全局級別,可用於選項文件,屬非動態變量。
relay-log-info-file=file_name
設定中繼服務用於記錄中繼信息的文件,默認為數據目錄中的relay-log.info。作用範圍為全局級別,可用於選項文件,屬非動態變量。
relay_log_purge={ON|OFF}
設定對不再需要的中繼日誌是否自動進行清理。默認值為ON。作用範圍為全局級別,可用於選項文件,屬動態變量。
relay_log_space_limit=#
設定用於存儲所有中繼日誌文件的可用空間大小。默認為0,表示不限定。最大值取決於系統平臺位數。作用範圍為全局級別,可用於選項文件,屬非動態變量。
slow_query_log={ON|OFF}
設定是否啟用慢查詢日誌。0或OFF表示禁用,1或ON表示啟用。日誌信息的輸出位置取決於log_output變量的定義,如果其值為NONE,則即便slow_query_log為ON,也不會記錄任何慢查詢信息。作用範圍為全局級別,可用於選項文件,屬動態變量。
slow_query_log_file=/PATH/TO/SOMEFILE
設定慢查詢日誌文件的名稱。默認為hostname-slow.log,但可以通過--slow_query_log_file選項修改。作用範圍為全局級別,可用於選項文件,屬動態變量。
sql_log_bin={ON|OFF}
用於控制二進制日誌信息是否記錄進日誌文件。默認為ON,表示啟用記錄功能。用戶可以在會話級別修改此變量的值,但其必須具有SUPER權限。作用範圍為全局和會話級別,屬動態變量。
sql_log_off={ON|OFF}
用於控制是否禁止將一般查詢日誌類信息記錄進查詢日誌文件。默認為OFF,表示不禁止記錄功能。用戶可以在會話級別修改此變量的值,但其必須具有SUPER權限。作用範圍為全局和會話級別,屬動態變量。
sync_binlog=#
設定多久同步一次二進制日誌至磁盤文件中,0表示不同步,任何正數值都表示對二進制每多少次寫操作之後同步一次。當autocommit的值為1時,每條語句的執行都會引起二進制日誌同步,否則,每個事務的提交會引起二進制日誌同步。
=============================================================================================
MySQL優化框架
1. SQL語句優化
2. 索引優化
3. 數據庫結構優化
4. InnoDB表優化
5. MyISAM表優化
6. Memory表優化
7. 理解查詢執行計劃
8. 緩沖和緩存
9. 鎖優化
10. MySQL服務器優化
11. 性能評估
12. MySQL優化內幕
MySQL優化需要在三個不同層次上協調進行:MySQL級別、OS級別和硬件級別。MySQL級別的優化包括表優化、查詢優化和MySQL服務器配置優化等,而MySQL的各種數據結構又最終作用於OS直至硬件設備,因此還需要了解每種結構對OS級別的資源的需要並最終導致的CPU和I/O操作等,並在此基礎上將CPU及I/O操作需要盡量降低以提升其效率。
數據庫層面的優化著眼點:
1、是否正確設定了表結構的相關屬性,尤其是每個字段的字段類型是否為最佳。同時,是否為特定類型的工作組織使用了合適的表及表字段也將影響系統性能,比如,數據頻繁更新的場景應該使用較多的表而每張表有著較少字段的結構,而復雜數據查詢或分析的場景應該使用較少的表而每張表較多字段的結構等。
2、是否為高效進行查詢創建了合適的索引。
3、是否為每張表選用了合適的存儲引擎,並有效利用了選用的存儲引擎本身的優勢和特性。
4、是否基於存儲引擎為表選用了合適的行格式(row format)。例如,壓縮表在讀寫操作中會降低I/O操作需求並占用較少的磁盤空間,InnoDB支持讀寫應用場景中使用壓縮表,但MyISAM僅能在讀環境中使用壓縮表。
5、是否使用了合適的鎖策略,如在並發操作場景中使用共享鎖,而對較高優先級的需求使用獨占鎖等。同時,還應該考慮存儲引擎所支持的鎖類型。
6、是否為InnoDB的緩沖池、MyISAM的鍵緩存以及MySQL查詢緩存設定了合適大小的內存空間,以便能夠存儲頻繁訪問的數據且又不會引起頁面換出。
操作系統和硬件級別的優化著眼點:
1、是否為實際的工作負載選定了合適的CPU,如對於CPU密集型的應用場景要使用更快速度的CPU甚至更多數量的CPU,為有著更多查詢的場景使用更多的CPU等。基於多核以及超線程(hyperthreading)技術,現代的CPU架構越來越復雜、性能也越來越強了,但MySQL對多CPU架構的並行計算能力的利用仍然是有著不太盡如人意之處,尤其是較老的版本如MySQL 5.1之前的版本甚至無法發揮多CPU的優勢。不過,通常需要實現的CPU性能提升目標有兩類:低遲延和高吞吐量。低延遲需要更快速度的CPU,因為單個查詢只能使用一顆;而需要同時運行許多查詢的場景,多CPU更能提供更好的吞吐能力,然而其能否奏效還依賴於實際工作場景,因為MySQL尚不能高效的運行於多CPU,並且其對CPU數量的支持也有著限制。一般來說,較新的版本可以支持16至24顆CPU甚至更多。
2、是否有著合適大小的物理內存,並通過合理的配置平衡內存和磁盤資源,降低甚至避免磁盤I/O。現代的程序設計為提高性能通常都會基於局部性原理使用到緩存技術,這對於頻繁操作數據的數據庫系統來說尤其如此——有著良好設計的數據庫緩存通常比針對通用任務的操作系統的緩存效率更高。緩存可以有效地延遲寫入、優化寫入,但並能消除寫入,並綜合考慮存儲空間的可擴展性等,為業務選擇合理的外部存儲設備也是非常重要的工作。
3、是否選擇了合適的網絡設備並正確地配置了網絡對整體系統系統也有著重大影響。延遲和帶寬是網絡連接的限制性因素,而常見的網絡問題如丟包等,即是很小的丟包率也會贊成性能的顯著下降。而更重要的還有按需調整系統中關網絡方面的設置,以高效處理大量的連接和小查詢。
4、是否基於操作系統選擇了適用的文件系統。實際測試表明大部分文件系統的性能都非常接近,因此,為了性能而苦選文件系統並不劃算。但考慮到文件系統的修復能力,應該使用日誌文件系統如ext3、ext4、XFS等。同時,關閉文件系統的某些特性如訪問時間和預讀行為,並選擇合理的磁盤調度器通常都會給性能提升帶來幫助。
5、MySQL為響應每個用戶連接使用一個單獨的線程,再加內部使用的線程、特殊目的線程以及其它任何由存儲引擎創建的線程等,MySQL需要對這些大量線程進行有效管理。Linux系統上的NPTL線程庫更為輕量級也更有效率。MySQL 5.5引入了線程池插件,但其效用尚不明朗。
使用InnoDB存儲引擎最佳實踐:
1、基於MySQL查詢語句中最常用的字段或字段組合創建主鍵,如果沒有合適的主鍵也最好使用AUTO_INCRMENT類型的某字段為主鍵。
2、根據需要考慮使用多表查詢,將這些表通過外鍵建立約束關系。
3、關閉autocommit。
4、使用事務(START TRANSACTION和COMMIT語句)組合相關的修改操作或一個整體的工作單元,當然也不應該創建過大的執行單元。
5、停止使用LOCK TABLES語句,InnoDB可以高效地處理來自多個會話的並發讀寫請求。如果需要在一系列的行上獲取獨占訪問權限,可以使用SELECT ... FOR UPDATE鎖定僅需要更新的行。
6、啟用innodb_file_per_table選項,將各表的數據和索引分別進行存放。
7、評估數據和訪問模式是否能從InnoDB的表壓縮功能中受益(在創建表時使用ROW_FORMAT=COMPRESSED選項),如果可以,則應該啟用壓縮功能。
EXPLAIN語句解析:
id:SELECT語句的標識符,一般為數字,表示對應的SELECT語句在原始語句中的位置。沒有子查詢或聯合的整個查詢只有一個SELECT語句,因此其id通常為1。在聯合或子查詢語句中,內層的SELECT語句通常按它們在原始語句中的次序進行編號。但UNION操作通常最後會有一個id為NULL的行,因為UNION的結果通常保存至臨時表中,而MySQL需要到此臨時表中取得結果。
select_type:
即SELECT類型,有如下值列表:
SIMPLE:簡單查詢,即沒有使用聯合或子查詢;
PRIMARY:UNION的最外圍的查詢或者最先進行的查詢;
UNION:相對於PRIMARY,為聯合查詢的第二個及以後的查詢;
DEPENDENT UNION:與UNION相同,但其位於聯合子查詢中(即UNION查詢本身是子查詢);
UNION RESULT:UNION的執行結果;
SUBQUERY:非從屬子查詢,優化器通常認為其只需要運行一次;
DEPENDENT SUBQUERY:從屬子查詢,優化器認為需要為外圍的查詢的每一行運行一次,如用於IN操作符中的子查詢;
DERIVED:用於FROM子句的子查詢,即派生表查詢;
table:
輸出信息所關系到的表的表名,也有可能會顯示為如下格式:
<unionM,N>:id為M和N的查詢執行聯合查詢後的結果;
<derivedN>:id為N的查詢執行的結果集;
type:
MySQL官方手冊中解釋type的作用為“type of join(聯結的類型)”,但其更確切的意思應該是“記錄(record)訪問類型”,因為其主要目的在於展示MySQL在表中找到所需行的方式。通常有如下所示的記錄訪問類型:
system: 表中僅有一行,是const類型的一種特殊情況;
const:表中至多有一個匹配的行,該行僅在查詢開始時讀取一次,因此,該行此字段中的值可以被優化器看作是個常量(constant);當基於PRIMARY KEY或UNIQUE NOT NULL字段查詢,且與某常量進行等值比較時其類型就為const,其執行速度非常快;
eq_ref:類似於const,表中至多有一個匹配的行,但比較的數值不是某常量,而是來自於其它表;ed_ref出現在PRIMARY KEY或UNIQUE NOT NULL類型的索引完全用於聯結操作中進行等值(=)比較時;這是除了system和const之外最好的訪問類型;
ref:查詢時的索引類型不是PRIMARY KEY或UNIQUE NOT NULL導致匹配到的行可能不惟一,或者僅能用到索引的左前綴而非全部時的訪問類型;ref可被用於基於索引的字段進行=或<=>操作;
fulltext:用於FULLTEXT索引中用純文本匹配的方法來檢索記錄。
ref_or_null:類似於ref,但可以額外搜索NULL值;
index_merge:使用“索引合並優化”的記錄訪問類型,相應地,其key字段(EXPLAIN的輸出結果)中會出現用到的多個索引,key_len字段中會出現被使用索引的最長長度列表;將多個“範圍掃描(range scan)”獲取到的行進行合並成一個結果集的操作即索引合並(index merge)。
unique_subquery:用於IN比較操作符中的子查詢中進行的“鍵值惟一”的訪問類型場景中,如 value IN (SELECT primary_key FROM single_table WHERE some_expr);
index_subquery:類似於unique_subquery,但子查詢中鍵值不惟一;
range:帶有範圍限制的索引掃描,而非全索引掃描,它開始於索引裏的某一點,返回匹配那個值的範圍的行;相應地,其key字段(EXPLAIN的輸出結果)中會輸出所用到的索引,key_len字段中會包含用到的索引的最長部分的長度;range通常用於將索引與常量進行=、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN或IN()類的比較操作中;
index:同全表掃描(ALL),只不過是按照索引的次序進行而不行的次序;其優點是避免了排序,但是要承擔按索引次序讀取整個表的開銷,這意味著若是按隨機次序訪問行,代價將非常大;
ALL:“全表掃描”的方式查找所需要的行,如果第一張表的查詢類型(EXPLAIN的輸出結果)為const,其性能可能不算太壞,而第一張表的查詢類型為其它結果時,其性能通常會非常差;
Extra:
Using where:MySQL服務器將在存儲引擎收到數據後進行“後過濾(post-filter)”以限定發送給下張表或客戶端的行;如果WHERE條件中使用了索引列,其讀取索引時就由存儲引擎檢查,因此,並非所有帶有WHERE子句的查詢都會顯示“Using where”;
Using index:表示所需要的數據從索引就能夠全部獲取到,從而不再需要從表中查詢獲取所需要數據,這意味著MySQL將使用覆蓋索引;但如果同時還出現了Using where,則表示索引將被用於查找特定的鍵值;
Using index for group-by:類似於Using index,它表示MySQL可僅通過索引中的數據完成GROUP BY或DISTINCT類的查詢;
Using filesort:表示MySQL會對結果使用一個外部索引排序,而不是從表裏按索引次序來讀取行;
====================================================================================
Mysql備份類型
熱備份:讀寫均不受影響
溫備份:僅可以執行讀操作
冷備份:離線備份,讀寫均停止
物理備份和邏輯備份
物理備份:復制數據文件,速度快,
邏輯備份:將數據導出至文本文件中,速度慢,容易丟失浮點精度,可移植能力強
完全備份、增量備份、差異備份
完全備份:備份所有數據
增量備份:僅備份上次完全備份後增加的數據
差異備份:以完全備份為準,備份差異數據,可能出現包含
備份什麽?數據,配置文件,二進制日誌,事務日誌
MyISAM:溫備份
InnoDB:熱備份xtrabackup,mysqldump
Mysql備份工具:
mysqldump:邏輯備份工具(對於MyISAM-溫備份,對於Innodb-熱備份)
mysqlhotcopy:物理備份工具、溫備份
文件系統工具:
cp:冷備用
lv:邏輯卷快照,幾乎熱備
mysql>FLUSH TABLES;
mysql>LOCK TABLES;
創建快照,釋放鎖,而後復制數據
第三方工具:
ibbackup:商業工具
xtrabackup:開源工具
mysqldump使用
mysql> FLUSH TABLES WITH READ LOCK;
root#mysqldump -uroot -p jiaowu > /root/jiaowu.sql
mysql> UNLOCK TABLES;
mysql> FLUSH LOGS;
mysql> SHOW BINARY LOGS;
--master-data={0|1|2}
0: 不記錄二進制日誌文件及路位置;
1:以CHNAGE MASTER TO的方式記錄位置,可用於恢復後直接啟動從服務器;
2:以CHANGE MASTER TO的方式記錄位置,但默認為被註釋;
將二進制日誌的保存點記錄在日誌中,下次接著備份就可以
root#mysqldump -uroot -p --master-data=2 studb > /root/studb-`data +%F-%H-%M-%S`.sql
--lock-all-tables:鎖定所有表
--flush-logs:執行日誌flush滾動
如果指定庫中的表類型均為InnoDB,可使用--single-transaction啟動熱備份
備份多個庫:
--all-databases:備份所有庫
--databases DB_NAME,DB_NAME :備份指定庫
備份所有庫(完全備份)
root# mysqldump -uroot -p --lock-all-tables --flush-logs --all-databases --master-data=2 > /root/all.sql
mysql>PURGE BINARY LOGS TO ‘mysql-bin.000011‘ (復制完二進制文件後,刪除11之前的日誌)
root# mysqlbinlog mysql-bin.0000111 > /root/mon-incremental.sql
備份策略:每周完全+每日增量
完全備份:mysqldump
增量備份:備份二進制日誌文件(flush logs)
模擬:
root# mysql_install_db --user=mysql --datadir=/mydata/data
root# service mysqld start
root# mysql -uroot -p < alldatabases.sql(導入完整) 因為初始化,root暫時為空密碼
root# mysql -uroot -p < mon-incremental.sql(導入增量)
本文出自 “網絡技術天地” 博客,請務必保留此出處http://1364952.blog.51cto.com/1354952/1954666
MySQL運維命令大全