mysql5.5手冊讀書日記(1)

<?phpphp

//mysql語句使用技巧html

/*
* 個人數據庫是5.5.2
*
* 查詢當前用戶的登錄的名字
* select user();
*
* 查詢當前mysql服務器時間和服務器版本
* select version(),current_time;
*
*
* 修改一個字段的屬性
*
*
* 查看mysql數據庫的user表,查看受權用戶
* use user;
* select host,user,password from user;
*
* 在shell 或者dos下登錄mysql
* 2者都須要吧mysql命令加入服務,或者切換到對應的目錄下
* mysql -h 127.0.0.1 -u root -p root
*
* 查詢全部數據庫
* show databases;
*
* 查詢全部表
* show tables;
*
*
* 修改表名字,表字段屬性
* ALTER TABLE `shopnc_address` CHANGE `address` `address1` VARCHAR( 2000 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地址'
* 原表名 新表名 字段屬性和長度改變 字符集 爲NULL
*
*
*
* 受權
* GRANT ALL PRIVILEGES ON *.* TO 'zx'@'localhost' IDENTIFIED BY 'zx123456' WITH GRANT OPTION;
* 全部權限 數據庫.表 用戶名 host主機 密碼
*
* 刷新權限
* FLUSH PRIVILEGES;
*
* 查看用戶受權
* show grants for user_name;多是由於版本緣由不能顯示
*
*
* --safe-user-create
若是啓用,用戶不能用GRANT語句建立新用戶,除非用戶有mysql.user表的INSERT權限。若是你想讓用戶具備受權權限來建立新用戶,你應給用戶授予下面
的權限:
* GRANT INSERT(user) ON mysql.user TO 'user_name'@'host_name';
*
*
*
* 收回權限
* REVOKE ALL PRIVILEGES ON *.* FROM myuser;
* 或者直接去user表刪除用戶也能夠
* delete from user where user = 'myuser';
*
* 查看錶結果
* DESCRIBE user;或者 show create table shopnc_orders;
*
*
* 查看一張表的索引
* show index from shopnc_orders;
*
* 查看系統的變量
* show variables;
*
* 查看每一個表的信息
* show table status;
*
* 查看mysql的狀態信息
* show status;
*
* 查看顯示服務器所支持的不一樣權限
* show privileges;
*
* 查看建立數據庫的信息
* show create database shopnc;
*
* 查看mysql支持那些數據庫引擎
* show engines;
*
* 查看innodb的狀態
* show innodb status;//有些有版本問題,沒法顯示
*
*
* 給表增長一個字段
* ALTER TABLE `shopnc_address` ADD `ss` VARCHAR( 24 ) NOT NULL AFTER `dlyp_id`
*
*
*
*
* 從本文件導入數據庫
*
* windows和linux路徑的斜槓是不同的,請注意若是用Windows中的編輯器(使用\r\n作爲行的結束符)建立文件,應使用:
* LOAD DATA LOCAL INFILE '/path/pet.txt' INTO TABLE pet
* LINES TERMINATED BY '\r\n';
* 在運行OS X的Apple機上,應使用行結束符'\r'。
* 由於不一樣系統和文件格式的須要不同,請更具詳細文檔在使用
*
*
* 匹配模式,
* 匹配p大頭的數據
*SELECT * FROM zx WHERE name LIKE 'p%';
*
* 匹配p結尾的數據
* SELECT * FROM zx WHERE name LIKE '%p';
*
* 匹配含有p的數據
* SELECT * FROM zx WHERE name LIKE '%p%';
*
*
* 匹配長度爲3的數據
* SELECT * FROM zx WHERE name LIKE '___';
*
* mysql還能夠使用正則表達式函數
* 用REGEXP和NOT REGEXP操做符(或RLIKE和NOT RLIKE,它們是同義詞)。
*
* SELECT * FROM pet WHERE name REGEXP BINARY '^b'; 匹配以b大頭的name
*
* SELECT * FROM pet WHERE name REGEXP 'fy$';匹配以fy結尾的name
*
*
* 選擇最大的article數值,別名爲article字段名,表別名也是同樣
* SELECT MAX(article) AS article FROM shop;
*
*
* concat函數
* 返回結果爲鏈接參數產生的字符串。若有任何一個參數爲NULL ,則返回值爲 NULL
*
* mysql> select concat('11','22','33');
+------------------------+
| concat('11','22','33') |
+------------------------+
| 112233 |
+------------------------+
*
mysql> select concat('11','22',NULL);
+------------------------+
| concat('11','22',NULL) |
+------------------------+
| NULL |
+------------------------+
*
*
*
mysqld是MySQL服務器
mysqld_safe、mysql.server和mysqld_multi是服務器啓動腳本
mysql_install_db初始化數據目錄和初始數據庫
*
mysql是一個命令行客戶程序,用於交互式或以批處理模式執行SQL語句。
o mysqladmin是用於管理功能的客戶程序。
o mysqlcheck執行表維護操做。
o mysqldump和mysqlhotcopy負責數據庫備份。
o mysqlimport導入數據文件。
o mysqlshow顯示信息數據庫和表的相關信息。
*
myisamchk執行表維護操做。
o myisampack產生壓縮、只讀的表。
o mysqlbinlog是處理二進制日誌文件的實用工具。
o perror顯示錯誤代碼的含義。
*
* 一些命令的使用
shell> mysql test
shell> mysqladmin extended-status variables
shell> mysqlshow --help
shell> mysqldump --user=root personnel
*
*
*
* 對於帶選項值的長選項,經過一個‘=’將選項名和值隔離開來。對於帶選項值的短選項,選項值能夠緊隨選項字母后面,或者兩者之間能夠用一個空格隔開。(-hlocalhost和-h localhost是等效的)。該規則的
例外狀況是指定MySQL密碼的選項。該選項的形式能夠爲--password=pass_val或--password。在後一種狀況(未給出密碼值),程序將提示輸入密碼。也能夠給出密碼選項,短形式爲-ppass_val或-p。然而,對於
短形式,若是給出了密碼值,必須緊跟在選項後面,中間不能插入空格。這樣要求的緣由是若是選項後面有空格,程序沒有辦法來告知後面的參量是密碼值仍是其它某種參量。所以,下面兩個命令的含義徹底不
同:
· shell> mysql -ptest
· shell> mysql -p testmysql

第一個命令讓mysql使用密碼test,但沒有指定默認數據庫。第二個命令讓mysql提示輸入密碼並使用test做爲默認數據庫。
*
*
*
*
*
部分選項控制能夠開關的行爲。例如,mysql客戶端支持--column-names選項,肯定是否在查詢結果開頭顯示一行欄目名。默認狀況,該選項被啓用。可是可能在某些狀況下你想要禁用它,例如將mysql的輸出
發送到另外一個只但願看到數據而不但願看到開始的標題行的程序中。
要想禁用列名,能夠使用下面的形式來指定選項:
--disable-column-names
--skip-column-names
--column-names=0
--disable和--skip前綴與=0後綴的效果相同:它們均關閉選項。
能夠用下述方法「啓用」選項:
--column-names
--enable-column-names
--column-names=1
*
*
*
*
*
對mysql偶爾有用的另外一個選項是-e或--execute選項,可用來將SQL語句傳遞給服務器。該語句必須用引號引發來(單引號或雙引號)。(然而,若是想要在查詢中將值引發來,則對於查詢應使用雙引號,查詢中引
用的值應使用單引號)。當使用該選項時,語句被執行,而後mysql當即退出命令外殼。
例如,你能夠用下面的命令得到用戶帳戶列表:
shell> mysql -u root -p -e "SELECT User, Host FROM User" mysql
Enter password: ******
+------+-----------+
| User | Host |
+------+-----------+
| | gigan |
| root | gigan |
| | localhost |
| jon | localhost |
| root | localhost |
+------+-----------+
後面的mysql是數據庫名字
*
*
* 查看系統變量
* show variables like '%log%';
* 查看全部系統變量
* show variables
*
查看是否支持分區
mysql> show variables like '%partition%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| have_partitioning | YES |
+-------------------+-------+
* 查看支持的插件
mysql> show plugins;
+-----------------------+----------+--------------------+---------+---------+
| Name | Status | Type | Library | License |
+-----------------------+----------+--------------------+---------+---------+
| binlog | ACTIVE | STORAGE ENGINE | NULL | GPL |
| mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL |
| mysql_old_password | ACTIVE | AUTHENTICATION | NULL | GPL |
| CSV | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MEMORY | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MRG_MYISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |
| ARCHIVE | ACTIVE | STORAGE ENGINE | NULL | GPL |
| BLACKHOLE | ACTIVE | STORAGE ENGINE | NULL | GPL |
| FEDERATED | DISABLED | STORAGE ENGINE | NULL | GPL |
| InnoDB | ACTIVE | STORAGE ENGINE | NULL | GPL |
| INNODB_TRX | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_LOCKS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_LOCK_WAITS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMP | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMP_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMPMEM | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMPMEM_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| PERFORMANCE_SCHEMA | ACTIVE | STORAGE ENGINE | NULL | GPL |
| partition | ACTIVE | STORAGE ENGINE | NULL | GPL |
+-----------------------+----------+--------------------+---------+---------+
*
*
*
* linux

mysqld
SQL後臺程序(即MySQL服務器)。要想使用客戶端程序,該程序必須運行,由於客戶端經過鏈接服務器來訪問數據庫。參見5.3節,「mysqld:MySQL服務
器」。
· mysqld-max
包括更多特性的一個服務器版本。參見5.1.2節,「mysqld-max擴展MySQL服務器」
· mysqld_safe
服務器啓動腳本。若是mysqld-max存在,mysqld_safe試圖啓動它,不然啓動mysqld。參見5.1.3節,「mysqld_safe:MySQL服務器啓動腳本」。
· mysql.server
服務器啓動腳本。該腳本用於使用包含爲特定級別的運行啓動服務的腳本的運行目錄的系統。它調用mysqld_safe來啓動MySQL服務器。參
見5.1.4節,「mysql.server:MySQL服務器啓動腳本」。
· mysqld_multi
服務器啓動腳本,能夠啓動或中止系統上安裝的多個服務器。參見5.1.5節,「mysqld_multi:管理多個MySQL服務器的程序」
· mysql_install_db
該腳本用默認權限建立MySQL受權表。一般只是在系統上首次安裝MySQL時執行一次。參見2.9.2節,「Unix下安裝後的過程」。
· mysql_fix_ privilege_tables
在升級安裝後,若是新版本MySQL中的受權表有更改,則使用該腳原本更改受權表。參見2.10.2節,「升級受權表」。
服務器主機上還運行其它幾個程序:
Chapter 5. Database Administration
file:///D:/download/refman-5.1-zh.html-chapter/refman-5.1-zh.html-chapter/database-administration.html[2010/2/24 5:21:46]
· myisamchk
用來描述、檢查、優化和維護MyISAM表的實用工具。在5.9.5節,「myisamchk:MyISAM表維護實用工具」中描述了myisamchk。
· make_binary_distribution
該程序能夠生成編譯過的MySQL的二進制版本。能夠經過FTP上傳到ftp.mysql.com的/pub/mysql/upload/,供其它MySQL用戶使用。
· mysqlbug
MySQL 缺陷報告腳本。它能夠用來向MySQL郵件系統發送缺陷報告。(你也能夠訪問http://bugs.mysql.com/在線建立缺陷報告文件。參見1.7.1.3節,「如何
通報缺陷和問題」)。正則表達式

 

要想找出你的服務器支持哪一個存儲引擎,執行下面的語句:
mysql> SHOW ENGINES;算法

 

 

 

shell> cd mysql_installation_directory
shell> bin/mysqld_safe &
若是mysqld_safe失敗,即便從MySQL安裝目錄調用仍然失敗,你能夠指定--ledir和--datadir選項來指示服務器和數據庫在你的系統中的安裝目錄。
通常狀況,你不該編輯mysqld_safe腳本。相反,應使用命令行選項或my.cnf選項文件的[mysqld_safe]部分的選項來配置mysqld_safe。通常不須要編
輯mysqld_safe來正確啓動服務器。可是,若是你編輯,未來升級MySQL後會覆蓋你修改的mysqld_safe版本,所以你應對你修改的版本進行備份以便將
來重裝。sql

 

 


mysqld_multi能夠管理多個幀聽不一樣Unix套接字文件和TCP/IP端口的鏈接的mysqld 進程。它能夠啓動或中止服務器,或報告它們的當前狀態。
程序尋找my.cnf中的[mysqldN]組(或--config-file選項指定的文件)。N 能夠爲任何正整數。在下面的討論中該數字指選項組號,或GNR。組號區別各選項組,
並用做mysqld_multi的參數來指定想要啓動、中止哪一個服務器或獲取哪一個服務器的狀態報告。這些組中的選項與將用來啓動mysqld的[mysqld]組中的相
同。(例如,參見2.9.2.2節,「自動啓動和中止MySQL」)。可是,當使用多個服務器時,須要每一個服務器使用本身的選項值,例如Unix套接字文件和TCP/IP端
口號。關於在多服務器環境中,每一個服務器對應惟一選項的詳細信息,參見5.12節,「在同一臺機器上運行多個MySQL服務器」。
要想調用mysqld_multi,使用下面的語法:
shell> mysqld_multi [options] {start|stop|report} [GNR[,GNR] ...]
start、stop和report表示你想要執行的操做。你能夠在單個服務器或多個服務器上執行指定的操做,取決於選項名後面的GNR 列。若是沒有該
列,mysqld_multi爲選項文件中的全部服務器執行該操做。
每一個GNR值表明一個選項組號或組號範圍。GNR值應爲選項文件中組名末尾的號。例如,組[mysqld17]的GNR爲17。要想指定組號的範圍,用破折號間隔開
第1個和最後1個號。GNR值10-13表明組[mysqld10]到[mysqld13]。能夠在命令行中指定多個組或組範圍,用逗號間隔開。GNR列不能有空格字符(空格
或tab);空格字符後面的內容將被忽略掉。
該命令使用選項組[mysqld17]啓動單個服務器:
shell> mysqld_multi start 17
該命令中止多個服務器,使用選項組[mysql8]和[mysqld10]至[mysqld13]:
shell> mysqld_multi stop 8,10-13
使用該命令列出設置選項文件的示例:
shell> mysqld_multi --example
mysqld_multi支持下面的選項:
· --config-file=name
指定選項文件名。這關係到mysqld_multi從哪裏尋找[mysqldN]選項組。沒有該選項,從通用my.cnf文件讀全部選項。選項不影響mysqld_multi從哪裏讀
取本身的選項,老是從通用my.cnf文件的[mysqld_multi]組讀取。
· --example
顯示示例選項文件。
· --help
顯示幫助消息並退出。
· --log=name
指定日誌文件名。若是該文件存在,後面爲日誌輸出。
Chapter 5. Database Administration
file:///D:/download/refman-5.1-zh.html-chapter/refman-5.1-zh.html-chapter/database-administration.html[2010/2/24 5:21:46]
· --mysqladmin=prog_name
用來中止服務器的mysqladmin二進制。
· --mysqld=prog_name
可用的mysqld二進制。請注意你還能夠將該選項的值指定爲mysqld_safe。選項被傳遞給mysqld。確保在PATH環境變量設定值或mysqld_safe中
有mysqld所在目錄。
· --no-log
按照標準輸出打印日誌信息,不要寫入日誌文件。默認狀況下,輸出寫入日誌文件。
· --password=password
調用mysqladmin時使用的MySQL帳戶的密碼。請注意該密碼值不是可選項,不象其它MySQL程序。
· --silent
禁用警告。
· --tcp-ip
經過TCP/IP端口而不是Unix套接字文件來鏈接每一個MySQL服務器。(若是找不到套接字文件, 服務器仍然能夠運行,但只能經過 TCP/IP端口訪問)。默認情
況下,使用Unix套接字文件進行鏈接。該選項影響stop和report操做。
· --user=user_name
調用mysqladmin時使用的MySQL帳戶的用戶名。
· --verbose
更詳細。
· --version
顯示版本信息並退出。
關於mysqld_multi的一些註解:
· 確保中止mysqld服務器(用mysqladmin程序)的MySQL帳戶在各個服務器中的用戶名和密碼相同。而且應確保帳戶具備SHUTDOWN權限。若是你想
要管理的服務器的管理帳戶有許多不一樣的用戶名或密碼,你須要在每一個服務器上建立一個帳戶,並具備相同的用戶名和密碼。例如,你能夠執行下面的命令
爲每一個服務器設置一個普通multi_admin帳戶:
· shell> mysql -u root -S /tmp/mysql.sock -proot_password
· mysql> GRANT SHUTDOWN ON *.*
· -> TO 'multi_admin'@'localhost' IDENTIFIED BY 'multipass';
參見5.7.2節,「權限系統工做原理」。你必須爲每一個mysqld服務器執行該操做。當鏈接時適當更改鏈接參數。請注意帳戶名的主機部分必須容許你
用multi_admin從你想要運行mysqld_multi的主機進行鏈接。
· 若是你使用mysqld_safe來啓動mysqld(例如,--mysqld=mysqld_safe),--pid-file選項很重要。每一個mysqld應有本身的進程ID文件。使
用mysqld_safe而不使用mysqld的好處是mysqld_safe「守護」其mysqld進程,若是用kill –9發送的信號或因爲其它緣由(例如分段故障)進程終止,則重
啓進程。請注意mysqld_safe腳本須要你從某個位置啓動它。這說明運行mysqld_multi前你必須進入某個目錄。若是啓動時有問題,請參
見mysqld_safe腳本。特別是要檢查下列行:
· ----------------------------------------------------------------
· MY_PWD=`pwd`
· # Check if we are starting this relative (for the binary release)
· if test -d $MY_PWD/data/mysql -a -f ./share/mysql/english/errmsg.sys -a \
· -x ./bin/mysqld
· ----------------------------------------------------------------
參見5.1.3節,「mysqld_safe:MySQL服務器啓動腳本」。上述行執行的測試應成功,不然你可能遇到了問題。
· 每一個mysqld的Unix套接字文件和TCP/IP端口號必須不一樣。
· 你可能想要爲mysqld使用--user選項,但爲此你須要用Unix root用戶運行mysqld_multi腳本。選項文件中有選項沒關係;若是你不是超級用戶,並
且你用本身的Unix帳戶重啓mysqld進程,你只會獲得警告。
· 重要:確保mysqld進程啓動所用Unix帳戶能夠徹底訪問數據目錄。不要使用Unix root帳戶,除非你知道你在作什麼。
· 很是重要:使用mysqld_multi前,確保理解傳遞給mysqld服務器的選項的含義以及你爲何想要獨立的mysqld進程。應清楚在相同的數據目錄下
使用多個mysqld服務器的危險。使用單獨的數據目錄,除非你知道你在作什麼。在線程系統中,在相同的數據目錄下啓動多個服務器不會獲得超性能。參
見5.12節,「在同一臺機器上運行多個MySQL服務器」。
下面的示例顯示了你如何設置選項文件來使用mysqld_multi。專門省去第1個和第5個[mysqldN]組來講明你的選項文件能夠稍有不一樣。這樣給你更大的靈活
Chapter 5. Database Administration
file:///D:/download/refman-5.1-zh.html-chapter/refman-5.1-zh.html-chapter/database-administration.html[2010/2/24 5:21:46]
性。mysqld程序重啓或中止的順序由它們在選項文件中的順序決定。
# This file should probably be in your home dir (~/.my.cnf)
# or /etc/my.cnf
# Version 2.1 by Jani Tolonen
[mysqld_multi]
mysqld = /usr/local/bin/mysqld_safe
mysqladmin = /usr/local/bin/mysqladmin
user = multi_admin
password = multipass
[mysqld2]
socket = /tmp/mysql.sock2
port = 3307
pid-file = /usr/local/mysql/var2/hostname.pid2
datadir = /usr/local/mysql/var2
language = /usr/local/share/mysql/english
user = john
[mysqld3]
socket = /tmp/mysql.sock3
port = 3308
pid-file = /usr/local/mysql/var3/hostname.pid3
datadir = /usr/local/mysql/var3
language = /usr/local/share/mysql/swedish
user = monty
[mysqld4]
socket = /tmp/mysql.sock4
port = 3309
pid-file = /usr/local/mysql/var4/hostname.pid4
datadir = /usr/local/mysql/var4
language = /usr/local/share/mysql/estonia
user = tonu
[mysqld6]
socket = /tmp/mysql.sock6
port = 3311
pid-file = /usr/local/mysql/var6/hostname.pid6
datadir = /usr/local/mysql/var6
language = /usr/local/share/mysql/japanese
user = janishell

 

 

START INSTANCE mysqld4;啓動一個MySQL實例 配置在my.cnf裏面的[mysqld4]段裏配置數據庫

顯示全部載入的實例名:
mysql> show instances;express


顯示選定的實例的狀態和版本信息:
SHOW INSTANCE STATUS mysqld3;

 


顯示實例使用的選項:
mysql> SHOW INSTANCE OPTIONS mysqld3;、


該命令提供實例使用的全部日誌文件
SHOW mysqld LOG FILES;


查看全部的日誌文件所在位置 很方便
SHOW VARIABLES LIKE '%log%'
以上全部的命令均可以在phpmyadmin上運行,這樣看起來就更方便,控制檯的顯示方式不太友好

Variable_name Value
back_log 50
binlog_cache_size 32768
binlog_direct_non_transactional_updates OFF
binlog_format MIXED
binlog_stmt_cache_size 32768
expire_logs_days 0
general_log OFF
general_log_file c:\wamp\bin\mysql\mysql5.5.20\data\USER-20141003JG...
innodb_flush_log_at_trx_commit 1
innodb_locks_unsafe_for_binlog OFF
innodb_log_buffer_size 8388608
innodb_log_file_size 5242880
innodb_log_files_in_group 2
innodb_log_group_home_dir .\
innodb_mirrored_log_groups 1
log OFF
log_bin ON
log_bin_trust_function_creators OFF
log_error c:\wamp\logs\mysql.log
log_output FILE
log_queries_not_using_indexes OFF
log_slave_updates OFF
log_slow_queries OFF
log_warnings 1
max_binlog_cache_size 18446744073709547520
max_binlog_size 1073741824
max_binlog_stmt_cache_size 18446744073709547520
max_relay_log_size 0
relay_log
relay_log_index
relay_log_info_file relay-log.info
relay_log_purge ON
relay_log_recovery OFF
relay_log_space_limit 0
slow_query_log OFF
slow_query_log_file c:\wamp\bin\mysql\mysql5.5.20\data\USER-20141003JG...
sql_log_bin ON
sql_log_off OFF
sync_binlog 0
sync_relay_log 0
sync_relay_log_info 0


SHOW mysqld LOG FILES;這個語句也能夠查看日誌文件地址,多是版本緣由有些狀況下不能查看


+-------------+------------------------------------+----------+
| Logfile | Path | Filesize |
+-------------+------------------------------------+----------+
| ERROR LOG | /home/cps/var/mysql/owlet.err | 9186 |
| GENERAL LOG | /home/cps/var/mysql/owlet.log | 471503 |
| SLOW LOG | /home/cps/var/mysql/owlet-slow.log | 4463 |
+-------------+------------------------------------+----------+
*
*
*
*
*
*
* MySQL服務器能夠以不一樣的SQL模式來操做,而且能夠爲不一樣客戶端應用不一樣模式。這樣每一個應用程序能夠根據本身的需求來定製服務器的操做模式。
模式定義MySQL應支持哪些SQL語法,以及應執行哪一種數據驗證檢查。這樣能夠更容易地在不一樣的環境中使用MySQL,並結合其它數據庫服務器使
用MySQL。
你能夠用--sql-mode="modes"選項啓動mysqld來設置默認SQL模式。若是你想要重設,該值還能夠爲空(--sql-mode ="")。
你還能夠在啓動後用SET [SESSION|GLOBAL] sql_mode='modes'語句設置sql_mode變量來更改SQL模式。設置GLOBAL變量時須要擁有SUPER權限,而且會
影響從那時起鏈接的全部客戶端的操做。設置SESSION變量隻影響當前的客戶端。任何客戶端能夠隨時更改本身的會話sql_mode值。
Modesis是用逗號(‘,’)間隔開的一系列不一樣的模式。你能夠用SELECT @@sql_mode語句查詢當前的模式。默認值是空(沒有設置任何模式)。
主要重要sql_mode值爲:
· ANSI
更改語法和行爲,使其更符合標準SQL。
· STRICT_TRANS_TABLES
若是不能將給定的值插入到事務表中,則放棄該語句。對於非事務表,若是值出如今單行語句或多行語句的第1行,則放棄該語句。本節後面給出了更詳細的
描述。
· TRADITIONAL
Make MySQL的行爲象「傳統」SQL數據庫系統。該模式的簡單描述是當在列中插入不正確的值時「給出錯誤而不是警告」。註釋:一旦發現錯誤當即放
棄INSERT/UPDATE。若是你使用非事務存儲引擎,這種方式不是你想要的,由於出現錯誤前進行的數據更改不會「滾動」,結果是更新「只進行了一部分」。
本手冊指「嚴格模式」,表示至少STRICT _TRANS_TABLES或STRICT _ALL_TABLES被啓用的模式。
下面描述了支持的全部模式:
· ALLOW_INVALID_DATES
在嚴格模式下不要檢查所有日期。只檢查1到12之間的月份和1到31之間的日。這在Web應用程序中,當你從三個不一樣的字段獲取年、月、日,而且想要確切
保存用戶插入的內容(不進行日期驗證)時很重要。該模式適用於DATE和DATETIME列。不適合TIMESTAMP列,TIMESTAMP列須要驗證日期。
啓用嚴格模式後,服務器須要合法的月和日,不只僅是分別在1到12和1到31範圍內。例如,禁用嚴格模式時'2004-04-31'是合法的,但啓用嚴格模式後是非
法的。要想在嚴格模式容許遮掩固定日期,還應啓用ALLOW_INVALID_DATES。
· ANSI_QUOTES
將‘"’視爲識別符引號(‘`’引號字符),不要視爲字符串的引號字符。在ANSI模式,你能夠仍然使用‘`’來引用識別符。啓用ANSI_QUOTES後,你不能用雙引號來
引用字符串,由於它被解釋爲識別符。
· ERROR_FOR_DIVISION_BY_ZERO
在嚴格模式,在INSERT或UPDATE過程當中,若是被零除(或MOD(X,0)),則產生錯誤(不然爲警告)。若是未給出該模式,被零除時MySQL返回NULL。若是用
到INSERT IGNORE或UPDATE IGNORE中,MySQL生成被零除警告,但操做結果爲NULL。
· HIGH_NOT_PRECEDENCE
NOT操做符的優先順序是表達式例如NOT a BETWEEN b AND c被解釋爲NOT (a BETWEEN b AND c)。在一些舊版本MySQL中, 表達式被解釋爲(NOT a)
BETWEEN b AND c。啓用HIGH_NOT_PRECEDENCESQL模式,能夠得到之前的更高優先級的結果
*
*
*
*
*
* 設置mysql的啓動模式
mysql> SET sql_mode = '';
mysql> SELECT NOT 1 BETWEEN -5 AND 5;
-> 0
mysql> SET sql_mode = 'broken_not';
mysql> SELECT NOT 1 BETWEEN -5 AND 5;
-> 1
*
*
*
*
*
* mysqld服務器維護兩種變量。全局變量影響服務器的全局操做。會話變量影響具體客戶端鏈接相關操做。
服務器啓動時,將全部全局變量初始化爲默認值。能夠在選項文件或命令行中指定的選項來更改這些默認值。服務器啓動後,經過鏈接服務器並執行SET
GLOBAL var_name語句能夠更改動態全局變量。要想更改全局變量,必須具備SUPER權限。
服務器還爲每一個客戶端鏈接維護會話變量。鏈接時使用相應全局變量的當前值對客戶端會話變量進行初始化。客戶能夠經過SET SESSION var_name語句來
更改動態會話變量。設置會話變量不須要特殊權限,但客戶能夠只更改本身的會話變量,而不更改其它客戶的會話變量。
任何訪問全局變量的客戶端均可以看見對全局變量的更改。可是,它隻影響在更改後鏈接的從該全局變量初始化相應會話變量的客戶端。它不會影響已經連
接上的客戶端的會話變量(甚至是執行SET GLOBAL語句的客戶端)。
當使用啓動選項設置變量時,變量值能夠使用後綴K、M或G分別表示千字節、兆字節或gigabytes。例如,下面的命令啓動服務器時的鍵值緩衝區大小爲16
megabytes:
mysqld --key_buffer_size=16M
後綴的大小寫美關係;16M和16m是一樣的。
運行時,使用SET語句來設置系統變量。此時,不能使用後綴,但值能夠採起下列表達式:
mysql> SET sort_buffer_size = 10 * 1024 * 1024;
要想顯式指定是否設置全局或會話變量,使用GLOBAL或SESSION選項:
mysql> SET GLOBAL sort_buffer_size = 10 * 1024 * 1024;
mysql> SET SESSION sort_buffer_size = 10 * 1024 * 1024;
*
*
*
*
*
*
mysql_fix_privilege_tables:升級MySQL系統表
* 一些MySQL發佈對mysql數據庫中的系統表的結構進行了更改,添加了新權限或特性。當你更新到新版本MySQL,你應同時更新系統表,以確保它們的結構最
新。首先備份mysql數據庫,而後按照下面的程序操做。
在Unix或Unix類系統中,運行mysql_fix_privilege_tables腳原本更新系統表:
shell> mysql_fix_privilege_tables
你必須在服務器運行時執行該腳本。它試圖鏈接本機上用root運行的服務器。若是root帳戶須要密碼,在命令行中按下述方法給出密碼:
shell> mysql_fix_privilege_tables--password=root_password
mysql_fix_privilege_tables腳本能夠執行將系統錶轉換爲當前格式的任何動做。運行時你可能會看見一些Duplicate column name警告;你能夠忽略它
們。
運行完腳本後,中止服務器並重啓。
在Windows系統中,MySQL分發包括mysql_fix_privilege_tables.sql SQL腳本,你能夠用mysql客戶端來運行。例如,若是MySQL安裝到C:\Program
Files\MySQL\MySQL Server 5.1,命令應爲:
C:\> C:\Program Files\MySQL\MySQL Server 5.1\bin\mysql -u root -p mysql
mysql> SOURCE C:/Program Files/MySQL/MySQL Server 5.1/scripts/mysql_fix_privilege_tables.sql
若是安裝到其它目錄,相應地更改路徑名。
mysql命令將提示輸入root密碼;按照提示輸入密碼。
在Unix中,當mysql處理mysql_fix_privilege_tables.sql script腳本中的語句時,你可能會看見一些Duplicate column name警告;你能夠忽略它們。
運行完腳本後,中止服務器並重啓。
*
*
*
*
*
*
* 嘗試訪問mysql端口是否能夠聯通
* telnet server_IP或者server_HOST 3306
*
*
*
* 若是你從源碼構建MySQL但沒有使用--enable-local-infile選項來進行configure,則客戶不能使用LOAD DATA LOCAL,除非顯式調用mysql_options
(...MYSQL_OPT_本地_INFILE,0)
你能夠用--local-infile=0選項啓動mysqld從服務器端禁用全部LOAD DATA LOCAL命令。
· 對於mysql命令行客戶端,能夠經過指定--local-infile[=1]選項啓用LOAD DATA LOCAL,或經過--local-infile=0選項禁用。相似地,對
於mysqlimport,--local or -L選項啓用本地數據文件裝載。在任何狀況下,成功進行本地裝載須要服務器啓用相關選項。
· 若是你使用LOAD DATA LOCAL Perl腳本或其它讀選項文件中的[client]組的程序,你能夠在組內添加local-infile=1選項。可是,爲了便面不理解localinfile
的程序產生問題,則規定使用loose- prefix:
· [client]
· loose-local-infile=1
· 若是LOAD DATA LOCAL INFILE在服務器或客戶端被禁用,試圖執行該語句的客戶端將收到下面的錯誤消息:
ERROR 1148: The used command is not allowed with this MySQL version
*
*
* MySQL提供的權限

權限 列 上下文
CREATE Create_priv 數據庫、表或索引
DROP Drop_priv 數據庫或表
GRANT OPTION Grant_priv 數據庫、表或保存的程序
REFERENCES References_priv 數據庫或表
ALTER Alter_priv 表
DELETE Delete_priv 表
INDEX Index_priv 表
INSERT Insert_priv 表
SELECT Select_priv 表
UPDATE Update_priv 表
CREATE VIEW Create_view_priv 視圖
SHOW VIEW Show_view_priv 視圖
ALTER ROUTINE Alter_routine_priv 保存的程序
CREATE ROUTINE Create_routine_priv 保存的程序
EXECUTE Execute_priv 保存的程序
FILE File_priv 服務器主機上的文件訪問
CREATE TEMPORARY TABLES Create_tmp_table_priv 服務器管理
LOCK TABLES Lock_tables_priv 服務器管理
CREATE USER Create_user_priv 服務器管理
PROCESS Process_priv 服務器管理
RELOAD Reload_priv 服務器管理
REPLICATION CLIENT Repl_client_priv 服務器管理
REPLICATION SLAVE Repl_slave_priv 服務器管理
SHOW DATABASES Show_db_priv 服務器管理
SHUTDOWN Shutdown_priv 服務器管理
SUPER Super_priv 服務器管理
*
*
*
* 其他的權限用於管理性操做,它使用mysqladmin程序或SQL語句實施。下表顯示每一個管理性權限容許你執行的mysqladmin命令:
權限權限擁有者容許執行的命令
RELOAD flush-hosts, flush-logs, flush-privileges, flush-status, flush-tables, flush-threads, refresh, reload
SHUTDOWN shutdown
PROCESS processlist
SUPER kill
reload命令告訴服務器將受權表從新讀入內存。flush-privileges是reload的同義詞,refresh命令清空全部表並打開並關閉記錄文件,其它flush-xxx命令執行類
似refresh的功能,可是範圍更有限,而且在某些狀況下可能更好用。例如,若是你只是想清空記錄文件,flush-logs比refresh是更好的選擇。
shutdown命令關掉服務器。只能從mysqladmin發出命令。沒有相應的SQL語句。
processlist命令顯示在服務器內執行的線程的信息(即其它帳戶相關的客戶端執行的語句)。kill命令殺死服務器線程。你老是能顯示或殺死你本身的線程,
可是你須要PROCESS權限來顯示或殺死其餘用戶和SUPER權限啓動的線程。參見13.5.5.3節,「KILL語法」。
擁有CREATE TEMPORARY TABLES權限即可以使用CREATE TABLE語句中的關鍵字TEMPORARY。
擁有LOCK TABLES權限即可以直接使用LOCK TABLES語句來鎖定你擁有SELECT權限的表。包括使用寫鎖定,能夠防止他人讀鎖定的表。
擁有REPLICATION CLIENT權限即可以使用SHOW MASTER STATUS和SHOW SLAVE STATUS。
REPLICATION SLAVE權限應授予從服務器所使用的將當前服務器鏈接爲主服務器的帳戶。沒有這個權限,從服務器不能發出對主服務器上的數據庫所發出的
更新請求。
擁有SHOW DATABASES權限便容許帳戶使用SHOW DATABASE語句來查看數據庫名。沒有該權限的帳戶只能看到他們具備部分權限的數據庫, 若是數據庫
用--skip-show-database選項啓動,則根本不能使用這些語句。請注意全局權限指數據庫的權限。
總的說來,只授予權限給須要他們的那些用戶是好主意,可是你應該在授予FILE和管理權限時試驗特定的警告:
FILE權限能夠被濫用於將服務器主機上MySQL能讀取的任何文件讀入到數據庫表中。包括任何人可讀的文件和服務器數據目錄中的文件。能夠使
用SELECT訪問數據庫表,而後將其內容傳輸到客戶端上。
GRANT權限容許用戶將他們的權限給其餘用戶。有不一樣的權限並有GRANT權限的2個用戶能夠合併權限。
ALTER權限能夠用於經過從新命名錶來推翻權限系統。
SHUTDOWN權限經過終止服務器能夠被濫用徹底拒絕爲其餘用戶服務。
PROCESS權限能被用來察看當前執行的查詢的明文文本,包括設定或改變密碼的查詢。
SUPER權限能用來終止其它用戶或更改服務器的操做方式。
授給mysql數據庫自己的權限能用來改變密碼和其餘訪問權限信息。密碼被加密存儲,因此惡意的用戶不能簡單地讀取他們以知道明文密碼。然而,具
有user表Password列寫訪問權限的用戶能夠更改帳戶的密碼,並能夠用該帳戶鏈接MySQL服務器。
有一些事情你不能用MySQL權限系統作到:
你不能明顯地指定某個給定的用戶應該被拒絕訪問。即,你不能明顯地匹配用戶而後拒絕鏈接。
你不能指定用戶有權建立立或刪除數據庫中的表,但不能建立或刪除數據庫自己。
*
*
*
*
*
*
若是你鏈接時指定主機名,但獲得錯誤消息主機名未顯示或爲IP號,表示當MySQL服務器將IP號解析爲客戶端來名時遇到錯誤:
· shell> mysqladmin -u root -pxxxx -h some-hostname ver
· Access denied for user 'root'@'' (using password: YES)
這表示DNS問題。要想修復,執行mysqladmin flush-hosts來重設內部 DNS主機名緩存
*
*
*
* 一些經常使用的解決方案包括:
o 試試找出DNS服務器的錯誤並修復。

o 在MySQL受權表中指定IP號而不是主機名。
o 在/etc/hosts中放入客戶端名。
o 用--skip-name-resolve選項啓動mysqld。
o 用--skip-host-cache選項啓動mysqld。
o 在Unix中,若是你在同一臺機器上運行服務器和客戶端,鏈接到localhost。鏈接到的localhost的Unix鏈接使用Unix套接字文件而不是TCP/IP。
o 在Windows中,你在同一臺機器上運行服務器和客戶端而且服務器支持命名管道鏈接,鏈接主機名(週期)。鏈接使用命名管道而不是TCP/IP。
若是mysql -u root test工做可是mysql -h your_hostname -u root test致使Access denied(your_hostname是本地機的實際主機名),那麼在user表中
可能沒有你的主機的正確名字。這裏的一個廣泛的問題是在user錶行中的Host值指定一個惟一的主機名,可是你係統的名字解析例程返回一個徹底正規
的域名(或相反)。例如,若是你在user表中有一個主機是'tcx'的行,可是你的DNS告訴MySQL你的主機名是'tcx.subnet.se',行將不工做。嘗試把一個
行加到user表中,它包含你主機的IP號做爲Host列的值。(另外,你能夠把一個行加到user表中,它有包含一個通配符如'tcx.%'的Host值。然而,使用
以「%」結尾的主機名是不安全的而且不推薦!)
若是mysql -u user_name test工做可是mysql -u user_name other_db_name不工做,你沒有爲給定的用戶授予other_db_name數據庫的訪問權限。
當在服務器上執行mysql -u user_name時,它工做,可是在其它遠程客戶端上執mysql -h host_name -u user_name時,它卻不工做,你沒有爲給定的
用戶授予從遠程主機訪問服務器的權限。
若是你不能弄明白你爲何獲得Access denied,從user表中刪除全部Host包含通配符值的行(包含「%」或「_」的條目)。一個很廣泛的錯誤是
用Host='%'和User='some_user'插入一個新行,認爲這將容許你指定localhost從同一臺機器進行鏈接。它不工做的緣由是默認權限包括一個
有Host='localhost'和User=''的行,由於那個行的Host值'localhost'比'%'更具體,當從localhost鏈接時,它用於指向新行!正確的步驟是插
入Host='localhost'和User='some_user'的第2個行,或刪除Host='localhost'和User=''行。刪除條目後,記住用FLUSH PRIVILEGES語句重載受權表。
· 若是你獲得下列錯誤,能夠與db或host表有關:
· Access to database denied
若是從db表中選擇了在Host列有空值的條目,保證在host表中有一個或多個相應的條目,指定db表中的條目適用哪些主機。
· 若是你可以鏈接MySQL服務器,但若是在使用命令SELECT ... INTO OUTFILE或LOAD DATA INFILE語句時,你獲得Access denied錯誤,在user表中的
條目可能沒有啓用FILE權限。
· 若是你直接更改受權表(例如,使用INSERT、UPDATE或DELETE語句)而且你的更改好像被忽略了,記住你必須執行FLUSH PRIVILEGES語句
或mysqladmin flush-privileges命令讓服務器來重讀受權表。不然,直到服務器下次重啓,你的更改方有效。記住用UPDATE命令更改root密碼後,在清
空權限前,你不須要指定新密碼,由於服務器還不知道你已經更改了密碼!
*
*
*
*
在MySQL 4.1以前,用PASSWORD()函數計算的密碼哈希值有16個字節長。應爲:
mysql> SELECT PASSWORD('mypass');
+--------------------+
| PASSWORD('mypass') |
+--------------------+
| 6f8c114b58f2ce9e |
+--------------------+
*
*
在MySQL 4.1中,已經對PASSWORD()函數進行了修改,能夠生成41字節的哈希值:
mysql> SELECT PASSWORD('mypass');
+-------------------------------------------+
| PASSWORD('mypass') |
+-------------------------------------------+
| *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
+-------------------------------------------+
*
*
*
*
限制MySQL服務器資源使用的一個方法是將max_user_connections系統變量設置爲非零值。可是,該方法嚴格限於全局,不容許管理具體帳戶。而且,它只
限制使用單一帳戶同時鏈接的數量,而不是客戶端鏈接後的操做。許多MySQL管理員對兩種類型的控制均感興趣,特別是Internet服務提供者。
在MySQL 5.1中,你能夠爲具體帳戶限制下面的服務器資源:
· 帳戶每小時能夠發出的查詢數
· 帳戶每小時能夠發出的更新數
· 帳戶每小時能夠鏈接服務器的次數
客戶端能夠執行的語句根據查詢限制來記數。只有修改數據庫或表的語句根據更新限制來記數。
還能夠限制每一個帳戶的同時鏈接服務器的鏈接數。
本文中的帳戶爲user表中的單個記錄。根據User和Host列值惟一識別每一個帳戶。
作爲使用該特性的先決條件,mysql數據庫的user表必須包含資源相關的列。資源限制保存
在max_questions、max_updates、max_connections和max_user_connections列內。若是user表沒有這些列,必須對它進行升級;參見2.10.2節,「升級受權
表」。
要想用GRANT語句設置資源限制,使WITH子句來命名每一個要限制的資源和根據每小時記數的限制值。例如,要想只以限制方式建立能夠訪問customer數據
庫的新帳戶,執行該語句:
mysql> GRANT ALL ON customer.* TO 'francis'@'localhost'
-> IDENTIFIED BY 'frank'
-> WITH MAX_QUERIES_PER_HOUR 20
-> MAX_UPDATES_PER_HOUR 10
-> MAX_CONNECTIONS_PER_HOUR 5
-> MAX_USER_CONNECTIONS 2;
限制類型不須要所有在WITH子句中命名,但已經命名的能夠按任何順序。每一個每小時限制值均應爲整數,表明每小時的記數。若是GRANT語句沒有WITH子
句,則每一個限制值設置爲默認值零(即沒有限制)。對於MAX_USER_CONNECTIONS,限制爲整數,表示帳戶一次能夠同時鏈接的最大鏈接數。若是限制設置
爲默認值零,則根據MAX_USER_CONNECTIONS系統變量肯定該帳戶能夠同時鏈接的數量。
要想設置或更改已有帳戶的限制,在全局級別使用GRANT USAGE語句(在*.*)。下面的語句能夠將francis的查詢限制更改成100:
mysql> GRANT USAGE ON *.* TO 'francis'@'localhost'
-> WITH MAX_QUERIES_PER_HOUR 100;
該語句沒有改變帳戶的已有權限,只修改了指定的限制值。
要想取消已有限制,將該值設置爲零。例如,要想取消francis每小時能夠鏈接的次數的限制,使用該語句:
mysql> GRANT USAGE ON *.* TO 'francis'@'localhost'
-> WITH MAX_CONNECTIONS_PER_HOUR 0;
當帳戶使用資源時若是有非零限制,則對資源使用進行記數。
服務器運行時,它統計每一個帳戶使用資源的次數。若是帳戶在最後一個小時的鏈接次數達到限制,該帳戶的進一步的鏈接被拒絕。相似地,若是帳戶達到查
詢或更新次數的限制,進一步的查詢或更新被拒絕。在這種狀況下,會給出相關錯誤消息。
根據每一個帳戶進行資源計算,而不是根據每一個客戶端。例如,若是你的帳戶的查詢限制爲50,你不能經過兩個客戶端同時鏈接服務器將限制增長到100。兩個
鏈接的查詢被計算到一塊兒。

能夠爲全部帳戶從全局重設當前的每小時資源使用記數,或單獨重設給定的帳戶:
· 要想將全部帳戶當前的記數重設爲零,能夠執行FLUSH USER_RESOURCES語句。還能夠經過重載受權表來重設記數(例如,使用FLUSH
PRIVILEGES語句或mysqladmin reload命令)。
· 將具體帳戶的限制從新授予任何值,能夠將它設置爲零。要想實現,按照前面所述使用GRANT USAGE,並將限制值指定爲該帳戶當前的限制值。
計數器重設不影響MAX_USER_CONNECTIONS限制。
當服務器啓動時全部記數從零開始。
*
*
*
*
*
MySQL能夠檢查X509證書的屬性和基於用戶名和密碼的通用鑑定方法。要想爲MySQL帳戶指定SSL相關選項,使用GRANT語句的REQUIRE子句。參
見13.5.1.3節,「GRANT和REVOKE語法」。
有多種可能來限制一個帳戶的鏈接類型:
· 若是帳戶沒有SSL或X509需求,若是用戶名和密碼合法,容許未加密的鏈接。可是,若是客戶有正確的證書和密鑰文件,在客戶選項中能夠使用加密
鏈接。
· REQUIRE SSL選項限制服務器只容許該帳戶的SSL加密鏈接。請注意若是有ACL記錄容許非SSL鏈接,該選項會被忽略。
· mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
· -> IDENTIFIED BY 'goodsecret' REQUIRE SSL;
· REQUIRE X509表示客戶必須有合法證書但確切的證書、分發者和主體不重要。惟一的需求是應能夠被某個CA認證機構驗證它的簽名。
· mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
· -> IDENTIFIED BY 'goodsecret' REQUIRE X509;
· REQUIRE ISSUER 'issuer'限制鏈接企圖,即客戶必須出示CA 'issuer'簽發的合法X509證書。若是客戶出示了一個合法證書,可是是由不一樣的分發者籤
發,服務器拒絕鏈接。使用X509證書表示要加密,所以不須要SSL選項。
· mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
· -> IDENTIFIED BY 'goodsecret'
· -> REQUIRE ISSUER '/C=FI/ST=Some-State/L=Helsinki/
· O=MySQL Finland AB/CN=Tonu Samuel/Email=tonu@example.com';
請注意ISSUER值應作爲單一字符串輸入。
· REQUIRE SUBJECT 'subject' 限制鏈接企圖,即客戶必須出示主題爲'subject'的合法X509證書。若是客戶出示了一個合法證書,可是有不一樣的主題,服
務器拒絕鏈接。
· mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
· -> IDENTIFIED BY 'goodsecret'

· -> REQUIRE SUBJECT '/C=EE/ST=Some-State/L=Tallinn/
· O=MySQL demo client certificate/
CN=Tonu Samuel/Email=tonu@example.com';
請注意SUBJECT值應作爲單一字符串輸入。
· REQUIRE CIPHER 'cipher'用來確保使用足夠強的密碼和密鑰長度。若是使用舊的短加密密鑰算法,SSL自己可能很弱。使用該選項,咱們能夠索取確
切的加密方法來鏈接。
· mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
· -> IDENTIFIED BY 'goodsecret'
-> REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA';
在REQUIRE子句中,能夠結合使用SUBJECT、ISSUER和CIPHER選項:
mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
-> IDENTIFIED BY 'goodsecret'
-> REQUIRE SUBJECT '/C=EE/ST=Some-State/L=Tallinn/
O=MySQL demo client certificate/
CN=Tonu Samuel/Email=tonu@example.com'
-> AND ISSUER '/C=FI/ST=Some-State/L=Helsinki/
O=MySQL Finland AB/CN=Tonu Samuel/Email=tonu@example.com'
-> AND CIPHER 'EDH-RSA-DES-CBC3-SHA';
請注意SUBJECT和ISSUER值應作爲單一字符串輸入。
在MySQL 5.1中,在REQUIRE選項之間能夠選用AND關鍵字。
選項的順序不重要,但任何選項不能用兩次。
*
*
*
*
備份數據庫的另外一個技術是使用mysqldump程序或mysqlhotcopy腳本。參見8.8節,「mysqldump:數據庫備份程序」和8.9節,「mysqlhotcopy:數據庫備
份程序」。
1. 徹底備份數據庫:
2. shell> mysqldump --tab=/path/to/some/dir --opt db_name
或:
shell> mysqlhotcopy db_name /path/to/some/dir
只要服務器再也不進行更新,還能夠只複製全部表文件(*.frm、*.MYD和*.MYI文件)。mysqlhotcopy腳本使用該方法。(但請注意若是數據庫包含InnoDB表,
這些方法不工做。InnoDB不將表的內容保存到數據庫目錄中,mysqlhotcopy只適合MyISAM表)。
3. 若是mysqld在運行則中止,而後用--log-bin[=file_name]選項來啓動。參見5.11.3節,「二進制日誌」。二進制日誌文件中提供了執行mysqldump以後
對數據庫的更改進行復制所須要的信息。
對於InnoDB表,能夠進行在線備份,不須要對錶進行鎖定;參見8.8節,「mysqldump:數據庫備份程序」。
MySQL支持增量備份:須要用--log-bin選項來啓動服務器以便啓用二進制日誌;參見5.11.3節,「二進制日誌」。當想要進行增量備份時(包含上一次徹底備份或
增量備份以後的全部更改),應使用FLUSH LOGS回滾二進制日誌。而後,你須要將從最後的徹底或增量備份的某個時刻到最後某個點的全部二進制日誌複製
到備份位置。這些二進制日誌爲增量備份;恢復時,按照下面的解釋應用。下次進行徹底備份時,還應使用FLUSH LOGS或mysqlhotcopy --flushlogs回滾二進
制日誌。參見8.8節,「mysqldump:數據庫備份程序」和8.9節,「mysqlhotcopy:數據庫備份程序」。
若是MySQL服務器爲從複製服務器,則不管選擇什麼備份方法,當備份從機數據時,還應備份master.info和relay-log.info文件。恢復了從機數據後,須要這
些文件來繼續複製。若是從機執行復制LOAD DATA INFILE命令,你應還備份用--slave-load-tmpdir選項指定的目錄中的SQL_LOAD-*文件。(若是未指定,該
位置默認爲tmpdir變量值)。從機須要這些文件來繼續複製中斷的LOAD DATA INFILE操做。
若是必須恢復MyISAM表,先使用REPAIR TABLE或myisamchk -r來恢復。99.9%的狀況下該方法能夠工做。若是myisamchk失敗,試試下面的方法。請注
意只有用--log-bin選項啓動了MySQL從而啓用二進制日誌它才工做;參見5.11.3節,「二進制日誌」。
1. 恢復原mysqldump備份,或二進制備份。
2. 執行下面的命令從新更新二進制日誌:
3. shell> mysqlbinlog hostname-bin.[0-9]* | mysql
在某些狀況下,你可能只想要從某個位置從新運行某些二進制日誌。(一般你想要從恢復備份的日期從新運行全部二進制日誌,查詢不正確時例外)。關

於mysqlbinlog工具和如何使用它的詳細信息參見8.6節,「mysqlbinlog:用於處理二進制日誌文件的實用工具」。
還能夠對具體文件進行選擇備份:
· 要想複製表,使用SELECT * INTO OUTFILE 'file_name' FROM tbl_name。
· 要想重載表,使用LOAD DATA INFILE 'file_name' REPLACE ...並恢復。要避免複製記錄,表必須有PRIMARY KEY或一個UNIQUE索引。當新記錄複製
惟一鍵值的舊記錄時,REPLACE關鍵字能夠將舊記錄替換爲新記錄。
若是備份時遇到服務器性能問題,能夠有幫助的一個策略是在從服務器而不是主服務器上創建複製並執行備份。參見6.1節,「複製介紹」。
若是使用Veritas文件系統,能夠這樣備份:
1. 從客戶端程序執行FLUSH TABLES WITH READ LOCK。
2. 從另外一個shell執行mount vxfs snapshot。
3. 從第一個客戶端執行UNLOCK TABLES。
4. 從快照複製文件。
5. 卸載快照。
*
*
*
*
*
*
*
*
*
*
shell> mysqldump --single-transaction --all-databases > backup_sunday_1_PM.sql
這是在線非塊備份,不會干擾對錶的讀寫。咱們之前假定咱們的表爲InnoDB表,所以--single-transaction使用一致性地讀,而且保證mysqldump所看見的數
據不會更改。(其它客戶端對InnoDB表進行的更改不會被mysqldump進程看見)。若是咱們還有其它類型的表,咱們必須假定在備份過程當中它們不會更改。
例如,對於mysql數據庫中的MyISAM表,咱們必須假定在備份過程當中沒有對MySQL帳戶進行管理更改。

--single-transaction
InnoDB 表在備份時,一般啓用選項 --single-transaction 來保證備份的一致性,實際上它的工做原理是設定本次會話的隔離級別爲:REPEATABLE READ,以確保本次會話(dump)時,不會看到其餘會話已經提交了的數據。
*
*
*
在星期一下午1點,咱們能夠清空日誌開始新的二進制日誌文件來建立增量備份。例如,執行mysqladmin flush-logs命令建立gbichot2-bin.000008。星期
日下午1點的徹底備份和星期一下午1點之間的全部更改成文件gbichot2-bin.000007。該增量備份很重要,所以最好將它複製到安全的地方。(例如,備份到磁
帶或DVD上,或複製到另外一臺機器上)。在星期二下午1點,執行另外一個mysqladmin flush-logs命令。星期一下午1點和星期二下午1點之間的全部全部更
改成文件gbichot2-bin.000008(也應複製到某個安全的地方)。
MySQL二進制日誌佔據硬盤空間。要想釋放空間,應隨時清空。操做方法是刪掉再也不使用的二進制日誌,例如進行徹底備份時:
shell> mysqldump --single-transaction --flush-logs --master-data=2
--all-databases --delete-master-logs > backup_sunday_1_PM.sql
註釋:若是你的服務器爲複製主服務器,用mysqldump --delete-master-logs刪掉MySQL二進制日誌很危險,由於從服務器可能尚未徹底處理該二進
制日誌的內容。
PURGE MASTER LOGS語句的描述中解釋了爲何在刪掉MySQL二進制日誌以前應進行確認
*
*
*
*
*
*
*
爲恢復進行備份
如今假設在星期三上午8點出現了災難性崩潰,須要使用備份文件進行恢復。恢復時,咱們首先恢復最後的徹底備份(從星期日下午1點開始)。徹底備份文件
是一系列SQL語句,所以恢復它很容易:
shell> mysql < backup_sunday_1_PM.sql

在該點,數據恢復到星期日下午1點的狀態。要想恢復從那時起的更改,咱們必須使用增量備份,也就是,gbichot2-bin.000007和gbichot2-bin.000008二進
制日誌文件。根據須要從備份處取過這些文件,而後按下述方式處理:
shell> mysqlbinlog gbichot2-bin.000007 gbichot2-bin.000008 | mysql
咱們如今將數據恢復到星期二下午1點的狀態,可是從該時刻到崩潰之間的數據仍然有丟失。要想恢復,咱們須要MySQL服務器將MySQL二進制日誌保存到安
全的位置(RAID disks, SAN, ...),應爲與數據文件的保存位置不一樣的地方,保證這些日誌不在毀壞的硬盤上。(也就是,咱們能夠用--log-bin選項啓動服務
器,指定一個其它物理設備上的與數據目錄不一樣的位置。這樣,即便包含該目錄的設備丟失,日誌也不會丟失)。若是咱們執行了這些操做,咱們手頭上會
有gbichot2-bin.000009文件,咱們能夠用它來恢復大部分最新的數據更改,而不會丟失到崩潰時的數據
*
*
*
* 指定恢復時間
若是MySQL服務器啓用了二進制日誌,你能夠使用mysqlbinlog工具來恢復從指定的時間點開始 (例如,從你最後一次備份)直到如今或另外一個指定的時間點
的數據。關於啓用二進制日誌的信息,參見5.11.3節,「二進制日誌」。對於mysqlbinlog的詳細信息,參見8.6節,「mysqlbinlog:用於處理二進制日誌文件
的實用工具」。
要想從二進制日誌恢復數據,你須要知道當前二進制日誌文件的路徑和文件名。通常能夠從選項文件(即my.cnf or my.ini,取決於你的系統)中找到路徑。如
果未包含在選項文件中,當服務器啓動時,能夠在命令行中以選項的形式給出。啓用二進制日誌的選項爲--log-bin。要想肯定當前的二進制日誌文件的文件
名,輸入下面的MySQL語句:
SHOW BINLOG EVENTS \G
你還能夠從命令行輸入下面的內容:
mysql --user=root -pmy_pwd -e 'SHOW BINLOG EVENTS \G'
將密碼my_pwd替換爲服務器的root密碼。
指定恢復時間
對於MySQL 4.1.4,能夠在mysqlbinlog語句中經過--start-date和--stop-date選項指定DATETIME格式的起止時間。舉例說明,假設在今天上午10:00(今天
是2005年4月20日),執行SQL語句來刪除一個大表。要想恢復表和數據,你能夠恢復前晚上的備份,並輸入:
mysqlbinlog --stop-date="2005-04-20 9:59:59" /var/log/mysql/bin.123456 \
| mysql -u root -pmypwd
該命令將恢復截止到在--stop-date選項中以DATETIME格式給出的日期和時間的全部數據。若是你沒有檢測到幾個小時後輸入的錯誤的SQL語句,可能你想要
恢復後面發生的活動。根據這些,你能夠用起使日期和時間再次運行mysqlbinlog:
mysqlbinlog --start-date="2005-04-20 10:01:00" /var/log/mysql/bin.123456 \
| mysql -u root -pmypwd \
在該行中,從上午10:01登陸的SQL語句將運行。組合執行前夜的轉儲文件和mysqlbinlog的兩行能夠將全部數據恢復到上午10:00前一秒鐘。你應檢查日誌
以確保時間確切。下一節介紹如何實現。
*
*
*
表維護和崩潰恢復
後面幾節討論如何使用myisamchk來檢查或維護MyISAM表(對應.MYI和.MYD文件的表)。
你能夠使用myisamchk實用程序來得到有關你的數據庫表的信息或檢查、修復、優化他們。下列小節描述如何調用myisamchk(包括它的選項的描述),
如何創建表的維護計劃,以及如何使用myisamchk執行各類功能。
儘管用myisamchk修復表很安全,在修復(或任何能夠大量更改表的維護操做)以前先進行備份也是很好的習慣
影響索引的myisamchk操做會使ULLTEXT索引用full-text參數重建,再也不與MySQL服務器使用的值兼容。要想避免,請閱讀5.9.5.1節,「用於myisamchk的一
般選項」的說明。
在許多狀況下,你會發現使用SQL語句實現MyISAM表的維護比執行myisamchk操做要容易地多:
· 要想檢查或維護MyISAM表,使用CHECK TABLE或REPAIR TABLE。
· 要想優化MyISAM表,使用OPTIMIZE TABLE。
· 要想分析MyISAM表,使用ANALYZE TABLE。
能夠直接這些語句,或使用mysqlcheck客戶端程序,能夠提供命令行接口。
這些語句比myisamchk有利的地方是服務器能夠作任何工做。使用myisamchk,你必須確保服務器在同一時間不使用表。不然,myisamchk和服務器之
間會出現不指望的相互干涉。
*
*
*
*
能夠使用myisamchk實用程序來得到有關數據庫表的信息或檢查、修復、優化他們。myisamchk適用MyISAM表(對應.MYI和.MYD文件的表)。
調用myisamchk的方法:
shell> myisamchk [options] tbl_name ...
options指定你想讓myisamchk作什麼。在後面描述它們。還能夠經過調用myisamchk --help獲得選項列表。
tbl_name是你想要檢查或修復的數據庫表。若是你不在數據庫目錄的某處運行myisamchk,你必須指定數據庫目錄的路徑,由於myisamchk不知道你的數
據庫位於哪兒。實際上,myisamchk不在意你正在操做的文件是否位於一個數據庫目錄;你能夠將對應於數據庫表的文件拷貝到別處而且在那裏執行恢復操
做。
若是你願意,能夠用myisamchk命令行命名幾個表。還能夠經過命名索引文件(用「 .MYI」後綴)來指定一個表。它容許你經過使用模式「*.MYI」指定在一個目
錄全部的表。例如,若是你在數據庫目錄,能夠這樣在目錄下檢查全部的MyISAM表:
shell> myisamchk *.MYI
若是你不在數據庫目錄下,可經過指定到目錄的路徑檢查全部在那裏的表:
shell> myisamchk /path/to/database_dir/*.MYI
你甚至能夠經過爲MySQL數據目錄的路徑指定一個通配符來檢查全部的數據庫中的全部表:
shell> myisamchk /path/to/datadir/*/*.MYI
推薦的快速檢查全部MyISAM表的方式是:
shell> myisamchk --silent --fast /path/to/datadir/*/*.MYI
若是你想要檢查全部MyISAM表並修復任何破壞的表,能夠使用下面的命令:
shell> myisamchk --silent --force --fast --update-state \
-O key_buffer=64M -O sort_buffer=64M \
-O read_buffer=1M -O write_buffer=1M \
/path/to/datadir/*/*.MYI
Chapter 5. Database Administration
file:///D:/download/refman-5.1-zh.html-chapter/refman-5.1-zh.html-chapter/database-administration.html[2010/2/24 5:21:46]
該命令假定你有大於64MB的自由內存。關於用myisamchk分配內存的詳細信息,參見5.9.5.5節,「myisamchk內存使用」。
當你運行myisamchk時,必須確保其它程序不使用表。不然,當你運行myisamchk時,會顯示下面的錯誤消息:
warning: clients are using or haven't closed the table properly
這說明你正嘗試檢查正被另外一個尚未關閉文件或已經終止而沒有正確地關閉文件的程序(例如mysqld服務器)更新的表。
若是mysqld正在運行,你必須經過FLUSH TABLES強制清空仍然在內存中的任何表修改。當你運行myisamchk時,必須確保其它程序不使用表。避免該問
題的最容易的方法是使用CHECK TABLE而不用myisamchk來檢查表
*
*
*
*
*
*
能夠使用myisamchk實用程序來得到有關數據庫表的信息或檢查、修復、優化他們。myisamchk適用MyISAM表(對應.MYI和.MYD文件的表)。
調用myisamchk的方法:
shell> myisamchk [options] tbl_name ...
options指定你想讓myisamchk作什麼。在後面描述它們。還能夠經過調用myisamchk --help獲得選項列表。
tbl_name是你想要檢查或修復的數據庫表。若是你不在數據庫目錄的某處運行myisamchk,你必須指定數據庫目錄的路徑,由於myisamchk不知道你的數
據庫位於哪兒。實際上,myisamchk不在意你正在操做的文件是否位於一個數據庫目錄;你能夠將對應於數據庫表的文件拷貝到別處而且在那裏執行恢復操
做。
若是你願意,能夠用myisamchk命令行命名幾個表。還能夠經過命名索引文件(用「 .MYI」後綴)來指定一個表。它容許你經過使用模式「*.MYI」指定在一個目
錄全部的表。例如,若是你在數據庫目錄,能夠這樣在目錄下檢查全部的MyISAM表:
shell> myisamchk *.MYI
若是你不在數據庫目錄下,可經過指定到目錄的路徑檢查全部在那裏的表:
shell> myisamchk /path/to/database_dir/*.MYI
你甚至能夠經過爲MySQL數據目錄的路徑指定一個通配符來檢查全部的數據庫中的全部表:
shell> myisamchk /path/to/datadir/*/*.MYI
推薦的快速檢查全部MyISAM表的方式是:
shell> myisamchk --silent --fast /path/to/datadir/*/*.MYI
若是你想要檢查全部MyISAM表並修復任何破壞的表,能夠使用下面的命令:
shell> myisamchk --silent --force --fast --update-state \
-O key_buffer=64M -O sort_buffer=64M \
-O read_buffer=1M -O write_buffer=1M \
/path/to/datadir/*/*.MYI

該命令假定你有大於64MB的自由內存。關於用myisamchk分配內存的詳細信息,參見5.9.5.5節,「myisamchk內存使用」。
當你運行myisamchk時,必須確保其它程序不使用表。不然,當你運行myisamchk時,會顯示下面的錯誤消息:
warning: clients are using or haven't closed the table properly
這說明你正嘗試檢查正被另外一個尚未關閉文件或已經終止而沒有正確地關閉文件的程序(例如mysqld服務器)更新的表。
若是mysqld正在運行,你必須經過FLUSH TABLES強制清空仍然在內存中的任何表修改。當你運行myisamchk時,必須確保其它程序不使用表。避免該問
題的最容易的方法是使用CHECK TABLE而不用myisamchk來檢查表
*
*
*
*
*
*
*
*
服務器時區支持
MySQL服務器有幾個時區設置:
· 系統時區。服務器啓動時便試圖肯定主機的時區,用它來設置system_time_zone系統變量。
· 服務器當前的時區。全局系統變量time_zone表示服務器當前使用的時區。初使值爲'SYSTEM',說明服務器時區與系統時區相同。能夠用--defaulttime-
zone=timez選項顯式指定初使值。若是你有SUPER 權限,能夠用下面的語句在運行時設置全局變量值:
· mysql> SET GLOBAL time_zone = timezone;

· 每一個鏈接的時區。每一個客戶端鏈接有本身的時區設置,用會話time_zone變量給出。其初使值與全局變量time_zone相同,但能夠用下面的語句重設:
· mysql> SET time_zone = timezone;
能夠用下面的方法查詢當前的全局變量值和每一個鏈接的時區:
mysql> SELECT @@global.time_zone, @@session.time_zone;
timezone值爲字符串,表示UTC的偏移量,例如'+10:00'或'-6:00'。若是已經建立並裝入mysql數據庫中的時區相關表,你還能夠使用命名的時區,例
如'Europe/Helsinki'、'US/Eastern'或'MET'。值'SYSTEM'說明該時區應與系統時區相同。時區名對大小寫不敏感。
MySQL安裝程序在mysql數據庫中建立時區表,但不裝載。你必須手動裝載。(若是你正從之前的版本升級到MySQL 4.1.3或更新版本,你應經過升級mysql數
據庫來建立表。參見2.10.2節,「升級受權表」中的說明)。
若是你的系統有本身的時區信息數據庫(描述時區的一系列文件),應使用mysql_tzinfo_to_sql程序來填充時區表。示例系統如Linux、FreeBSD、Sun
Solaris和Mac OS X。這些文件的可能位置爲/usr/share/zoneinfo目錄。若是你的系統沒有時區信息數據庫,能夠使用本節後面描述的下載的軟件包。
mysql_tzinfo_to_sql程序用來裝載時區表。在命令行中,將時區信息目錄路徑名傳遞到mysql_tzinfo_to_sql並輸出發送到mysql程序。例如:
shell> mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
mysql_tzinfo_to_sql讀取系統時區文件並生成SQL語句。mysql處理這些語句並裝載時區表。
mysql_tzinfo_to_sql還能夠用來裝載單個時區文件,並生成閏秒信息。
要想裝載對應時區tz_name的單個時區文件tz_file,應這樣調用mysql_tzinfo_to_sql:
shell> mysql_tzinfo_to_sql tz_file tz_name | mysql -u root mysql
若是你的時區須要計算閏秒,按下面方法初使化閏秒信息,其中tz_file是時區文件名:
shell> mysql_tzinfo_to_sql --leap tz_file | mysql -u root mysql
若是你的系統沒有時區信息數據庫 (例如,Windows或HP-UX),你能夠從http://dev.mysql.com/downloads/timezones.html下載預構建時區表軟件包。該軟件
包包含MyISAM時區表所用的.frm、.MYD和.MYI文件。這些表應屬於mysql數據庫,所以應將這些文件放到MySQL服務器數據目錄的mysql子目錄。操做時應
關閉服務器。
警告!若是你的系統有時區信息數據庫,請不要使用下載的軟件包。而應使用mysql_tzinfo_to_sql實用工具!不然,MySQL和系統上其它應用程序處理日
期時間的方法會有所不一樣。
*
*
*
MySQL有幾個不一樣的日誌文件,能夠幫助你找出mysqld內部發生的事情:
日誌文件記入文件中的信息類型
錯誤日誌記錄啓動、運行或中止mysqld時出現的問題。
查詢日誌記錄創建的客戶端鏈接和執行的語句。
更新日誌記錄更改數據的語句。不同意使用該日誌。
二進制日誌記錄全部更改數據的語句。還用於複製。
慢日誌記錄全部執行時間超過long_query_time秒的全部查詢或不使用索引的查詢。
默認狀況下,全部日誌建立於mysqld數據目錄中。經過刷新日誌,你能夠強制mysqld來關閉和從新打開日誌文件(或者在某些狀況下切換到一個新的日
志)。當你執行一個FLUSH LOGS語句或執行mysqladmin flush-logs或mysqladmin refresh時,出現日誌刷新。參見13.5.5.2節,「FLUSH語法」。
若是你正使用MySQL複製功能,從複製服務器將維護更多日誌文件,被稱爲接替日誌
*
*
*
*
*
*
*
*
MySQL有幾個不一樣的日誌文件,能夠幫助你找出mysqld內部發生的事情:
日誌文件記入文件中的信息類型
錯誤日誌記錄啓動、運行或中止mysqld時出現的問題。
查詢日誌記錄創建的客戶端鏈接和執行的語句。
更新日誌記錄更改數據的語句。不同意使用該日誌。
二進制日誌記錄全部更改數據的語句。還用於複製。
慢日誌記錄全部執行時間超過long_query_time秒的全部查詢或不使用索引的查詢。
默認狀況下,全部日誌建立於mysqld數據目錄中。經過刷新日誌,你能夠強制mysqld來關閉和從新打開日誌文件(或者在某些狀況下切換到一個新的日
志)。當你執行一個FLUSH LOGS語句或執行mysqladmin flush-logs或mysqladmin refresh時,出現日誌刷新。參見13.5.5.2節,「FLUSH語法」。
若是你正使用MySQL複製功能,從複製服務器將維護更多日誌文件,被稱爲接替日誌
*
*
*
*
*
*
*
*
*
作爲服務啓動多個Windows服務器
在基於NT的系統中,MySQL服務器能夠以Windows服務的方式來運行。安裝、控制和刪除單個MySQL服務的過程描述見2.3.12節,「以Windows服務方式啓
動MySQL」。
你還能夠以服務的方式安裝多個MySQL服務器。此時,除了全部參數對每一個服務器必須是惟一的,你還必須確保每一個服務器使用不一樣的服務名。
在下面的說明中,假設你想要運行mysqld-nt服務器的兩個不一樣的版本,它們分別安裝在C:\mysql-4.1.8和C:\mysql-5.1.2-alpha目錄中。(可能存在這種情
況,若是你正在運行版本4.1.8做爲你的產品服務器,還想使用5.1.2-alpha版原本進行測試)。
當用--install或--install-manual選項安裝一個MySQL服務時,應聽從如下原則:
· 若是你沒有指定服務名,服務器使用默認的MySQL服務名,從標準選項文件的[mysqld]組中讀取選項。
· 若是你在--install選項後指定了服務名,服務器忽略[mysqld]選項組,從具備相同名的組中讀取選項做爲服務名。服務器從標準選項文件中讀取選項。
· 若是你在服務名後面指定一個--defaults-file選項,服務器忽略標準選項文件,只從命名的文件的[mysqld]組讀取選項。
註釋:MySQL 4.0.17以前,只有使用默認服務名(MySQL)安裝的一個服務器或使用服務名mysqld顯式安裝的一個服務器從標準選項文件讀[mysqld]組。
到4.0.17時,若是服務器讀標準選項文件,則它們均讀[mysqld]組,即便它們安裝時使用了另外一個服務名。這樣容許你爲選項使用[mysqld]組,用於所
有MySQL服務器,並將根據每一個服務器命名的選項組用於該服務器,即便用那個服務名安裝的服務器。
根據前面敘述,你能夠經過幾個方法來設置多個服務器。下面的說明描述了一些示例。在嘗試以前,應確保你首先關閉而且卸載了全部已有的MySQL服務
器。
· 方法1:在一個標準選項文件中指定全部服務器選項。要想這樣作,爲每一個服務器使用不一樣的服務名。假設你想使用服務名mysqld1運行4.1.8版
的mysqld-nt並使用服務名mysqld2運行5.1.2-alpha版的mysqld-nt。在這種狀況下,你能夠爲4.1.8使用[mysqld1]組,爲5.1.2-alpha使用[mysqld2]組。例
如,你能夠象這樣創建C:\my.cnf文件:
· # options for mysqld1 service
· [mysqld1]
· basedir = C:/mysql-4.1.8
· port = 3307
· enable-named-pipe
· socket = mypipe1

·
· # options for mysqld2 service
· [mysqld2]
· basedir = C:/mysql-5.1.2-alpha
· port = 3308
· enable-named-pipe
· socket = mypipe2
以下面所示安裝服務器,使用服務器的全路徑名來確保Windows爲每一個服務註冊正確的可執行程序:
C:\> C:\mysql-4.1.8\bin\mysqld-nt --install mysqld1
C:\> C:\mysql-5.1.2-alpha\bin\mysqld-nt --install mysqld2
爲了啓動服務器,使用服務管理器,或用帶有適當的服務名的NET START:
C:\> NET START mysqld1
C:\> NET START mysqld2
要想中止服務,使用服務管理器,或用帶有適當的服務名的NET STOP:
C:\> NET STOP mysqld1
C:\> NET STOP mysqld2
· 方法2:爲每一個服務器用不一樣的文件指定選項,當你安裝服務時使用--defaults-file告訴每一個服務器使用什麼文件。此時,每一個文件應用一個[mysqld]組
列出選項。
使用這種方法爲4.1.8版本的mysqld-nt指定選項,應象這樣建立一個C:\my-opts1.cnf文件:
[mysqld]
basedir = C:/mysql-4.1.8
port = 3307
enable-named-pipe
socket = mypipe1
對於5.1.2-alpha版的mysqld-nt,象這樣建立一個C:\my-opts2.cnf文件:
[mysqld]
basedir = C:/mysql-5.1.2-alpha port = 3308
enable-named-pipe
socket = mypipe2
安裝服務以下(在一個單一行中輸入每一個命令):
C:\> C:\mysql-4.1.8\bin\mysqld-nt -- installmysqld1
--defaults-file=C:\my-opts1.cnf
C:\> C:\mysql-5.1.2-alpha\bin\mysqld-nt -- installmysqld2
--defaults-file=C:\my-opts2.cnf
當你做爲服務安裝一個MySQL服務器時,要想使用--defaults-file選項,你必須在此選項以前加服務名。
安裝服務後,按照與前面的示例相同的方法啓動和中止。
要想卸載多個服務,對每一個服務使用mysqld --remove,在--remove選項後指定服務名。若是服務名是默認的(MySQL),你能夠不指定。
5.12.2. 在Unix中運行多個服務器
在Unix中運行多個服務器最容易的方法是使用不一樣的TCP/IP端口s和Unix套接字文件編譯,所以每一個實例在不一樣的網絡接口偵聽。另外,每一個安裝應在不一樣的
基礎目錄中編譯,那將自動爲你的每一個服務器產生使用不一樣的編譯進來的數據目錄、日誌文件和PID文件位置。
假設一個現有的4.1.8版本服務器配置爲默認TCP/IP端口號(3306)和Unix套接字文件(/tmp/mysql.sock)。要想配置一個新的5.1.2-alpha版的服務器來使用不一樣
的操做參數,使用一個configure命令,大概象這樣使用:
shell> ./configure --with-tcp-port=port_number \
--with-unix-socket-path=file_name \
--prefix=/usr/local/mysql-5.1.2-alpha
這裏,port_number和file_name必須不一樣於默認TCP/IP端口號和Unix套接字文件路徑名,而且--prefix值應指定一個不一樣於現有MySQL安裝目錄的安裝目錄。
若是你有一個MySQL服務器正偵聽一個給定的端口號,你能夠使用下面的命令來找出針對一些重要配置變量它使用了那些操做參數,包括基礎目錄和Unix套
接字文件名:
shell>mysqladmin --host=host_name --port=port_number variables
經過該命令顯示的信息,當配置其它服務器時,你能夠告訴服務器該選項沒有使用的值。
請注意,若是你指定localhost做爲一個主機名,mysqladmin默認使用Unix套接字文件鏈接,而不是TCP/IP。從 MySQL 4.1開始,經過--protocol= TCP |
SOCKET | PIPE | MEMORY}選項,你能夠顯示地指定鏈接協議。
若是隻是用一個不一樣的Unix套接字文件和TCP/IP端口號啓動,沒必要編譯新的MySQL服務器。還能夠在運行時指定這些值。這樣作的一個方法是使用命令行選
項:
shell> mysqld_safe --socket=file_name --port=port_number
要啓動第二個服務器,提供不一樣的--socket和--port選項值,而且傳遞一個--datadir=path選項給mysqld_safe,以便服務器使用一個不一樣的數據目錄。
達到類似效果的另外一個方法是使用環境變量來設置 Unix套接字文件名和TCP/IP端口號:
shell> MYSQL_UNIX_PORT=/tmp/mysqld-new.sock
shell> MYSQL_TCP_PORT=3307
shell> export MYSQL_UNIX_PORT MYSQL_TCP_PORT
shell> mysql_install_db --user=mysql
shell> mysqld_safe --datadir=/path/to/datadir &
這是一個快速啓動第二個服務器以用於測試的方法。該方法的最大好處是環境變量設定值適用於你從相同的shell調用的任何客戶端程序。於是,那些客戶端
鏈接自動指向第二個服務器!
附錄F:環境變量包括你能夠使用的影響mysqld的其它環境變量列表。
對於自動服務器啓動,對於每一個服務器,機器引導時執行的啓動腳本應執行下面的命令,每一個命令用一個相應的選項文件路徑:
mysqld_safe --defaults-file=path
每一個選項文件應包含一個給定服務器特定的選項值。
在Unix中,mysqld_multi腳本是啓動多個服務器的另外一個方法
*
*
*
*
在多服務器環境中使用客戶端程序
當你想要用一個客戶端程序鏈接一個MySQL服務器時,該服務器偵聽不一樣的網絡接口,而不是編譯到你的客戶端的網絡接口,你能夠使用下面的方法:
· 啓動客戶端,用--host=host_name --port=port_number經過TCP/IP來鏈接一個遠程服務器,用--host=127.0.0.1 --port=port_number經過TCP/IP來
鏈接一個本地服務器,或者用--host=localhost --socket=file_name經過一個Unix套接字文件或一個Windows命名管道來鏈接一個本地服務器。
· 從MySQL 4.1起,啓動客戶端時用--protocol=tcp經過TCP/IP來鏈接,用--protocol=socket經過一個Unix套接字文件來鏈接,用--protocol=pipe經過一
個命名管道來鏈接,或用--protocol=memory經過共享內存來鏈接。對於TCP/IP鏈接,你可能還須要指定--host和--port選項。對於其它類型的鏈接,你可能
須要指定一個--socket選項來指定一個Unix套接字文件或命名管道名,或者一個--shared-memory-base-name選項來指定共享內存名。共享內存鏈接僅
在Windows中支持。
· 在Unix中,在你啓動客戶端以前,設置MYSQL_UNIX_PORT和MYSQL_TCP_PORT環境變量來指定Unix套接字文件和TCP/IP端口號。若是你常用具
體的套接字文件或端口號,你能夠在.login文件中放置命令來設置環境變量以便你每次登陸時該命令起做用。參見附錄F:環境變量。
· 在一個選項文件的[client]組中指定默認Unix套接字文件和TCP/IP端口號。例如,你能夠在Windows中使用C:\my.cnf文件,或在Unix中主目錄內使
用.my.cnf文件。參見4.3.2節,「使用選項文件」。
· 在C程序中,在mysql_real_connect()調用時,你能夠指定套接字文件或端口號參數。經過調用mysql_options(),你還能夠有程序讀選項文件。參
見25.2.3節,「C API函數描述」。
· 若是你正在使用Perl DBD::mysql模塊,你能夠從MySQL選項文件中讀取選項。例如:
· $dsn = "DBI:mysql:test;mysql_read_default_group=client;"
· . "mysql_read_default_file=/usr/local/mysql/data/my.cnf";
· $dbh = DBI->connect($dsn, $user, $password);
參見25.4節,「MySQL Perl API」。
其它程序接口能夠爲讀選項文件提供類似的功能。
*
*
*
*
查詢高速緩衝如何工做
本節描述查詢緩存的工做原理。5.13.3節,「查詢高速緩衝配置」描述了怎樣控制是否使用查詢緩存。
查詢解析以前進行比較,所以下面的兩個查詢被查詢緩存認爲是不相同的:
SELECT * FROM tbl_name
Select * from tbl_name
查詢必須是徹底相同的(逐字節相同)纔可以被認爲是相同的。另外,一樣的查詢字符串因爲其它緣由可能認爲是不一樣的。使用不一樣的數據庫、不一樣的協議版
本或者不一樣默認字符集的查詢被認爲是不一樣的查詢而且分別進行緩存。
從查詢緩存中提取一個查詢以前,MySQL檢查用戶對全部相關數據庫和表的SELECT權限。若是沒有權限,不使用緩存結果。
若是從查詢緩存中返回一個查詢結果,服務器把Qcache_hits狀態變量的值加一,而不是Com_select變量。參見5.13.4節,「查詢高速緩衝狀態和維護」。
若是一個表被更改了,那麼使用那個表的全部緩衝查詢將再也不有效,而且從緩衝區中移出。這包括那些映射到改變了的表的使用MERGE表的查詢。一個表可
以被許多類型的語句更改,例如INSERT、UPDATE、DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE。
COMMIT執行完後,被更改的事務InnoDB表再也不有效。
使用InnoDB表時,查詢緩存也在事務中工做,使用該表的版本號來檢測其內容是否仍舊是當前的。
在MySQL 5.1中,視圖產生的查詢被緩存。
SELECT SQL_CALC_FOUND_ROWS ...和SELECT FOUND_ROWS() type類型的查詢使用查詢緩存。即便因建立的行數也被保存在緩衝區內,前面的查詢從緩
存中提取,FOUND_ROWS()也返回正確的值。
若是一個查詢包含下面函數中的任何一個,它不會被緩存:
BENCHMARK() CONNECTION_ID() CURDATE()
CURRENT_DATE() CURRENT_TIME() CURRENT_TIMESTAMP()
CURTIME() DATABASE() 帶一個參數的ENCRYPT()
FOUND_ROWS() GET_LOCK() LAST_INSERT_ID()
LOAD_FILE() MASTER_POS_WAIT() NOW()
RAND() RELEASE_LOCK() SYSDATE()
不帶參數的UNIX_TIMESTAMP() USER()
在下面的這些條件下,查詢也不會被緩存:
· 引用自定義函數(UDFs)。
· 引用自定義變量。
· 引用mysql系統數據庫中的表。
· 下面方式中的任何一種:
SELECT ...IN SHARE MODE
SELECT ...FOR UPDATE
SELECT ...INTO OUTFILE ...
SELECT ...INTO DUMPFILE ...
SELECT * FROM ...WHERE autoincrement_col IS NULL
最後一種方式不能被緩存是由於它被用做爲ODBC工做區來獲取最近插入的ID值。參見26.1.14.1節,「如何在ODBC中獲取AUTO_INCREMENT列的值」。

· 被做爲編寫好的語句,即便沒有使用佔位符。例如,下面使用的查詢:
char *my_sql_stmt = "SELECT a,b FROM table_c";
/* ...*/
mysql_stmt_prepare(stmt,my_sql_stmt,strlen(my_sql_stmt));
不被緩存。參見25.2.4節,「C API預處理語句」。
· 使用TEMPORARY表。
· 不使用任何表。
· 用戶有某個表的列級權限。
*
*
*
*
*
*
查詢高速緩衝SELECT選項
能夠在SELECT語句中指定查詢緩存相關選項:
· SQL_CACHE
若是query_cache_type系統變量的值是ON或DEMAND,查詢結果被緩存。
· SQL_NO_CACHE
查詢結果不被緩存。
示例:
SELECT SQL_CACHE id, name FROM customer;
SELECT SQL_NO_CACHE id, name FROM customer;
5.13.3. 查詢高速緩衝配置
經過have_query_cache服務器系統變量指示查詢緩存是否可用:
mysql> SHOW VARIABLES LIKE 'have_query_cache';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| have_query_cache | YES |
+------------------+-------+
即便禁用查詢緩存,當使用標準 MySQL二進制時,這個值老是YES。
其它幾個系統變量控制查詢緩存操做。當啓動mysqld時,這些變量能夠在選項文件或者命令行中設置。全部查詢緩存系統變量名以query_cache_ 開頭。它
們的詳細描述見5.3.3節,「服務器系統變量」,還給出了額外的配置信息。
爲了設置查詢緩存大小,設置query_cache_size系統變量。設置爲0表示禁用查詢緩存。默認緩存大小設置爲0;也就是禁用查詢緩存。
當設置query_cache_size變量爲非零值時,應記住查詢緩存至少大約須要40KB來分配其數據結構。(具體大小取決於系統結構)。若是你把該值設置的過小,
將會獲得一個警告,如本例所示:
mysql> SET GLOBAL query_cache_size = 40000;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> SHOW WARNINGS\G
*************************** 1. row ***************************
Level: Warning
Code: 1282
Message: Query cache failed to set size 39936; new query cache size is 0
mysql> SET GLOBAL query_cache_size = 41984;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW VARIABLES LIKE 'query_cache_size';

+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| query_cache_size | 41984 |
+------------------+-------+
若是查詢緩存大小設置爲大於0,query_cache_type變量影響其工做方式。這個變量能夠設置爲下面的值:
· 0或OFF將阻止緩存或查詢緩存結果。
· 1或ON將容許緩存,以SELECT SQL_NO_CACHE開始的查詢語句除外。
· 2或DEMAND,僅對以SELECT SQL_CACHE開始的那些查詢語句啓用緩存。
設置query_cache_type變量的GLOBAL值將決定更改後全部鏈接客戶端的緩存行爲。具體客戶端能夠經過設置query_cache_type變量的會話值控制它們自己連
接的緩存行爲。例如,一個客戶能夠禁用本身的查詢緩存,方法以下:
mysql> SET SESSION query_cache_type = OFF;
要控制能夠被緩存的具體查詢結果的最大值,應設置query_cache_limit變量。默認值是1MB。
當一個查詢結果(返回給客戶端的數據)從查詢緩衝中提取期間,它在查詢緩存中排序。所以,數據一般不在大的數據塊中處理。查詢緩存根據數據排序要
求分配數據塊,所以,當一個數據塊用完後分配一個新的數據塊。由於內存分配操做是昂貴的(費時的),因此經過query_cache_min_res_unit系統變量給查詢
緩存分配最小值。當查詢執行時,最新的結果數據塊根據實際數據大小來肯定,所以能夠釋放不使用的內存。根據你的服務器執行查詢的類型,你會發現調
整query_cache_min_res_unit變量的值是有用的:
· query_cache_min_res_unit默認值是4KB。這應該適合大部分狀況。
· 若是你有大量返回小結果數據的查詢,默認數據塊大小可能會致使內存碎片,顯示爲大量空閒內存塊。因爲缺乏內存,內存碎片會強制查詢緩存從緩
存內存中修整(刪除)查詢。這時,你應該減小query_cache_min_res_unit變量的值。空閒塊和因爲修整而移出的查詢的數量通
過Qcache_free_blocks和Qcache_lowmem_prunes變量的值給出。
· 若是大量查詢返回大結果(檢查 Qcache_total_blocks和Qcache_queries_in_cache狀態變量),你能夠經過增長query_cache_min_res_unit變量的值
來提升性能。可是,注意不要使它變得太大(參見前面的條目)。
5.13.4. 查詢高速緩衝狀態和維護
能夠使用下面的語句檢查MySQL服務器是否提供查詢緩存功能:
mysql> SHOW VARIABLES LIKE 'have_query_cache';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| have_query_cache | YES |
+------------------+-------+
能夠使用FLUSH QUERY CACHE語句來清理查詢緩存碎片以提升內存使用性能。該語句不從緩存中移出任何查詢。
RESET QUERY CACHE語句從查詢緩存中移出全部查詢。FLUSH TABLES語句也執行一樣的工做。
爲了監視查詢緩存性能,使用SHOW STATUS查看緩存狀態變量:
mysql> SHOW STATUS LIKE 'Qcache%';
+-------------------------+--------+
|變量名 |值 |
+-------------------------+--------+
| Qcache_free_blocks | 36 |
| Qcache_free_memory | 138488 |
| Qcache_hits | 79570 |
| Qcache_inserts | 27087 |
| Qcache_lowmem_prunes | 3114 |
| Qcache_not_cached | 22989 |
| Qcache_queries_in_cache | 415 |
| Qcache_total_blocks | 912 |
+-------------------------+--------+

這些變量的描述見5.3.4節,「服務器狀態變量」。這裏描述它們的一些應用。
SELECT查詢的總數量等價於:
Com_select
+ Qcache_hits
+ queries with errors found by parser
Com_select的值等價於:
Qcache_inserts
+ Qcache_not_cached
+ queries with errors found during columns/rights check
查詢緩存使用長度可變塊,所以Qcache_total_blocks和Qcache_free_blocks能夠顯示查詢緩存內存碎片。執行FLUSH QUERY CACHE後,只保留一個空閒塊。
每一個緩存查詢至少須要兩個塊(一個塊用於查詢文本,一個或多個塊用於查詢結果)。而且,每個查詢使用的每一個表須要一個塊。可是,若是兩個或多個
查詢使用相同的表,僅須要分配一個塊。
Qcache_lowmem_prunes狀態變量提供的信息可以幫助你你調整查詢緩存的大小。它計算爲了緩存新的查詢而從查詢緩衝區中移出到自由內存中的查詢的數
目。查詢緩衝區使用最近最少使用(LRU)策略來肯定哪些查詢從緩衝區中移出。調整信息在5.13.3節,「查詢高速緩衝配置」中給出。
*
*
*
*
從服務器設置爲複製主服務器的數據後,它鏈接主服務器並等待更新過程。若是主服務器失敗,或者從服務器
失去與主服務器之間的鏈接,從服務器保持按期嘗試鏈接,直到它可以繼續幀聽更新。由--master-connectretry
選項控制重試間隔。默認爲60秒
*
*

複製實施細節
MySQL使用3個線程來執行復制功能(其中1個在主服務器上,另兩個在從服務器上。當發出START SLAVE時,
從服務器建立一個I/O線程,以鏈接主服務器並讓它發送記錄在其二進制日誌中的語句。主服務器建立一個線
程將二進制日誌中的內容發送到從服務器。該線程能夠識別爲主服務器上SHOW PROCESSLIST的輸出中
的Binlog Dump線程。從服務器I/O線程讀取主服務器Binlog Dump線程發送的內容並將該數據拷貝到從服務器
數據目錄中的本地文件中,即中繼日誌。第3個線程是SQL線程,是從服務器建立用於讀取中繼日誌並執行日
志中包含的更新。
在前面的描述中,每一個從服務器有3個線程。有多個從服務器的主服務器建立爲每一個當前鏈接的從服務器建立
一個線程;每一個從服務器有本身的I/O和SQL線程。
這樣讀取和執行語句被分紅兩個獨立的任務。若是語句執行較慢則語句讀取任務沒有慢下來。例如,若是從服
I/O

務器有一段時間沒有運行了,當從服務器啓動時,其線程能夠很快地從主服務器索取全部二進制日誌內
容,即便SQL線程遠遠滯後。若是從服務器在SQL線程執行完全部索取的語句前中止,I/O 線程至少已經索取
了全部內容,以便語句的安全拷貝保存到本地從服務器的中繼日誌中,供從服務器下次啓動時執行。這樣容許
清空主服務器上的二進制日誌,由於再也不須要等候從服務器來索取其內容。
SHOW PROCESSLIST語句能夠提供在主服務器上和從服務器上發生的關於複製的信息。
下面的例子說明了這3個線程在SHOW PROCESSLIST中的顯示。
在主服務器上,SHOW PROCESSLIST的輸出看上去應爲:
mysql> SHOW PROCESSLIST\G
*************************** 1. row ***************************
Id: 2
User: root
Host: localhost:32931
db: NULL
Command: Binlog Dump
Time: 94
State: Has sent all binlog to slave; waiting for binlog to
be updated
Info: NULL
這兒,線程2是一個鏈接從服務器的複製線程。該信息表示全部主要更新已經被髮送到從服務器,主服務器正
等待更多的更新出現。
在從服務器上,SHOW PROCESSLIST的輸出看上去應爲:
mysql> SHOW PROCESSLIST\G
*************************** 1. row ***************************
Id: 10
User: system user
Host:
db: NULL
Command: Connect
Time: 11
State: Waiting for master to send event
Info: NULL
*************************** 2. row ***************************
Id: 11
User: system user
Host:
db: NULL
Command: Connect
Time: 11

State: Has read all relay log; waiting for the slave I/O
thread to update it
Info: NULL
該信息表示線程10是同主服務器通訊的I/O線程,線程11是處理保存在中繼日誌中的更新的SQL線程。SHOW
PROCESSLIST運行時,兩個線程均空閒,等待其它更新。
請注意Time列的值能夠顯示從服務器比主服務器滯後多長時間
*
*
*
*
*
*
*
複製主線程狀態
下面列出了主服務器的Binlog Dump線程的State列的最多見的狀態。若是你沒有在主服務器上看見任何Binlog
Dump線程,這說明覆制沒有在運行—即,目前沒有鏈接任何從服務器。
· Sending binlog event to slave
二進制日誌由各類事件組成,一個事件一般爲一個更新加一些其它信息。線程已經從二進制日誌讀取了一個事
件而且正將它發送到從服務器。
· Finished reading one binlog; switching to next binlog
線程已經讀完二進制日誌文件而且正打開下一個要發送到從服務器的日誌文件。
· Has sent all binlog to slave; waiting for binlog to be updated
線程已經從二進制日誌讀取全部主要的更新並已經發送到了從服務器。線程如今正空閒,等待由主服務器上新
的更新致使的出如今二進制日誌中的新事件。
· Waiting to finalize termination
線程中止時發生的一個很簡單的狀態。
6.3.2. 複製從I/O線程狀態
下面列出了從服務器的I/O線程的State列的最多見的狀態。該狀態也出如今Slave_IO_State列,由SHOW
SLAVE STATUS顯示。這說明你能夠只經過該語句仔細瀏覽所發生的事情。
· Connecting to master
線程正試圖鏈接主服務器。
· Checking master version
創建同主服務器之間的鏈接後當即臨時出現的狀態。
· Registering slave on master
創建同主服務器之間的鏈接後當即臨時出現的狀態。
· Requesting binlog dump
創建同主服務器之間的鏈接後當即臨時出現的狀態。線程向主服務器發送一條請求,索取從請求的二進制日誌
文件名和位置開始的二進制日誌的內容。
· Waiting to reconnect after a failed binlog dump request

若是二進制日誌轉儲請求失敗(因爲沒有鏈接),線程進入睡眠狀態,而後按期嘗試從新鏈接。能夠使用--
master-connect-retry選項指定重試之間的間隔。
· Reconnecting after a failed binlog dump request
線程正嘗試從新鏈接主服務器。
· Waiting for master to send event
線程已經鏈接上主服務器,正等待二進制日誌事件到達。若是主服務器正空閒,會持續較長的時間。若是等待
持續slave_read_timeout秒,則發生超時。此時,線程認爲鏈接被中斷並企圖從新鏈接。
· Queueing master event to the relay log
線程已經讀取一個事件,正將它複製到中繼日誌供SQL線程來處理。
· Waiting to reconnect after a failed master event read
讀取時(因爲沒有鏈接)出現錯誤。線程企圖從新鏈接前將睡眠master-connect-retry秒。
· Reconnecting after a failed master event read
線程正嘗試從新鏈接主服務器。當鏈接從新創建後,狀態變爲Waiting for master to send event。
· Waiting for the slave SQL thread to free enough relay log space
正使用一個非零relay_log_space_limit值,中繼日誌已經增加到其組合大小超過該值。I/O線程正等待直
到SQL線程處理中繼日誌內容並刪除部分中繼日誌文件來釋放足夠的空間。
· Waiting for slave mutex on exit
線程中止時發生的一個很簡單的狀態。
6.3.3. 複製從SQL線程狀態
下面列出了從服務器的SQL線程的State列的最多見的狀態。
· Reading event from the relay log
線程已經從中繼日誌讀取一個事件,能夠對事件進行處理了。
· Has read all relay log; waiting for the slave I/O thread to update it
線程已經處理了中繼日誌文件中的全部事件,如今正等待I/O線程將新事件寫入中繼日誌。
· Waiting for slave mutex on exit
線程中止時發生的一個很簡單的狀態。
I/O線程的State列也能夠顯示語句的文本。這說明線程已經從中繼日誌讀取了一個事件,從中提取了語句,並
且正在執行語句。
6.3.4. 複製傳遞和狀態文件
默認狀況,中繼日誌使用host_name-relay-bin.nnnnnn形式的文件名,其中host_name是從服務器主機

名,nnnnnn是序列號。用連續序列號來建立連續中繼日誌文件,從000001開始。從服務器跟蹤索引文件中目
前正使用的中繼日誌。默認中繼日誌索引文件名爲host_name-relay-bin.index。默認狀況,在從服務器的數據
目錄中建立這些文件。能夠用--relay-log和--relay-log-index服務器選項覆蓋默認文件名。參見6.8節,「複製啓
動選項」。
中繼日誌與二進制日誌的格式相同,而且能夠用mysqlbinlog讀取。SQL線程執行完中繼日誌中的全部事件並
且再也不須要以後,當即自動刪除它。沒有直接的刪除中繼日誌的機制,由於SQL線程能夠負責完成。然
而,FLUSH LOGS能夠循環中繼日誌,當SQL線程刪除日誌時會有影響。
在下面的條件下建立新的中繼日誌:
· 每次I/O線程啓動時建立一個新的中繼日誌。
· 當日志被刷新時;例如,用FLUSH LOGS或mysqladmin flush-logs。
· 噹噹前的中繼日誌文件變得太大時。「太大」含義的肯定方法:
o max_relay_log_size,若是max_relay_log_size > 0
o max_binlog_size,若是max_relay_log_size = 0
從屬複製服務器在數據目錄中另外建立兩個小文件。這些狀態文件默認名爲主master.info和relay-log.info。它
們包含SHOW SLAVE STATUS語句的輸出所顯示的信息(關於該語句的描述參見13.6.2節,「用於控制從服務器
的SQL語句」)。狀態文件保存在硬盤上,從服務器關閉時不會丟失。下次從服務器啓動時,讀取這些文件以確
定它已經從主服務器讀取了多少二進制日誌,以及處理本身的中繼日誌的程度。
由I/O線程更新master.info文件。文件中的行和SHOW SLAVE STATUS顯示的列的對應關係爲:
行描述
1 文件中的行號
2 Master_Log_File
3 Read_Master_Log_Pos
4 Master_Host
5 Master_User
6 密碼(不禁SHOW SLAVE STATUS顯示)
7 Master_Port
8 Connect_Retry
9 Master_SSL_Allowed
10 Master_SSL_CA_File
11 Master_SSL_CA_Path
12 Master_SSL_Cert
13 Master_SSL_Cipher
14 Master_SSL_Key
由SQL線程更新relay-log.info文件。文件中的行和SHOW SLAVE STATUS顯示的列的對應關係爲:
行描述
1 Relay_Log_File
2 Relay_Log_Pos
3 Relay_Master_Log_File
4 Exec_Master_Log_Pos
Chapter 6. Replication in MySQL
file:///D:/download/refman-5.1-zh.html-chapter/refman-5.1-zh.html-chapter/replication.html[2010/2/24 5:22:02]
當備份從服務器的數據時,你還應備份這兩個小文件以及中繼日誌文件。它們用來在恢復從服務器的數據後繼
續進行復制。若是丟失了中繼日誌但仍然有relay-log.info文件,你能夠經過檢查該文件來肯定SQL線程已經執
行的主服務器中二進制日誌的程度。而後能夠用Master_Log_File和Master_LOG_POS選項執行CHANGE
MASTER TO來告訴從服務器從新從該點讀取二進制日誌。固然,要求二進制日誌仍然在主服務器上。
若是從服務器正複製LOAD DATA INFILE語句,你應也備份該目錄內從服務器用於該目的的任何SQL_LOAD-
*文件。從服務器須要這些文件繼續複製任何中斷的LOAD DATA INFILE操做。用--slave-load-tmpdir選項來指
定目錄的位置。若是未指定, 默認值爲tmpdir變量的值。
*
*
*
*
*
*
*
假定你的域爲mydomain.com,想要建立用戶名爲repl的一個帳戶,從服務器能夠使用該帳戶從你的域內的任何
主機使用密碼slavepass來訪問主服務器。要建立該帳戶,可以使用GRANT語句:
mysql> GRANT REPLICATION SLAVE ON *.*
-> TO 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';
若是你計劃從從屬服務器主機使用LOAD TABLE FROM MASTER或LOAD DATA FROM MASTER語句,你須要授
予該帳戶其它權限:
· 授予帳戶SUPER和RELOAD全局權限。
· 爲全部想要裝載的表授予SELECT權限。任何該帳戶不能SELECT的主服務器上的表被LOAD DATA
FROM MASTER忽略掉。
3. 執行FLUSH TABLES WITH READ LOCK語句清空全部表和塊寫入語句:
4. mysql> FLUSH TABLES WITH READ LOCK;
對於InnoDB表,請注意:FLUSH TABLES WITH READ LOCK還鎖定COMMIT操做。當得到全局讀鎖定後,能夠

開始InnoDB表的文件系統快照。快照不能保證內部(在InnoDB存儲引擎內部)一致性(由於InnoDB緩存沒有刷
新),但並不須要關心該問題,由於InnoDB能夠在啓動時解決該問題並給出一致的結果。這說明InnoDB在啓動
快照時能夠進行崩潰恢復,而不會破壞。然而,當保證一致的InnoDB錶快照時,尚未途徑來中止MySQL服
務器。
讓客戶程序保持運行,發出FLUSH TABLES語句讓讀鎖定保持有效。(若是退出客戶程序,鎖被釋放)。而後對
主服務器上的數據進行快照。
建立快照最簡單的途徑是使用歸檔程序對主服務器上的數據目錄中的數據庫進行二進制備份。例如,在Unix中
使用tar,或者在Windows中使用PowerArchiver、WinRAR、WinZip或者相似的軟件。要使用tar來建立包
括全部數據庫的歸檔文件,進入主服務器的數據目錄,而後執行命令:
shell> tar -cvf /tmp/mysql-snapshot.tar .
若是你想讓歸檔只包括this_db數據庫,應使用命令:
shell> tar -cvf /tmp/mysql-snapshot.tar ./this_db
而後將歸檔文件複製到從服務器主機的/tmp目錄。在該機器上,進入從服務器的數據目錄,並使用下述命令解
壓縮歸檔文件:
shell> tar -xvf /tmp/mysql-snapshot.tar
若是從服務器的用戶帳戶與主服務器的不一樣,你可能不想複製mysql數據庫。在這種狀況下,應從歸檔中排除
該數據庫。你也不須要在歸檔中包括任何日誌文件或者master.info或relay-log.info文件。
當FLUSH TABLES WITH READ LOCK所置讀鎖定有效時,讀取主服務器上當前的二進制日誌名和偏移量值:
mysql > SHOW MASTER STATUS;
+---------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| mysql-bin.003 | 73 | test | manual,mysql |
+---------------+----------+--------------+------------------+
File列顯示日誌名,而Position顯示偏移量。在該例子中,二進制日誌值爲mysql-bin.003,偏移量爲73。記錄
該值。之後設置從服務器時須要使用這些值。它們表示複製座標,從服務器應從該點開始從主服務器上進行新
的更新。
取得快照並記錄日誌名和偏移量後,能夠在主服務器上從新啓用寫活動:
mysql> UNLOCK TABLES;
若是你正使用InnoDB表,理想狀況應使用InnoDB Hot Backup工具,使用該工具能夠得到一致的快照而不需
要在主服務器上進行鎖定,而且能夠對應從服務器上使用的快照來記錄日誌名和偏移量。Hot Backup是一個
附加的非免費(商業)工具,沒有包含在標準 MySQL分發中。詳細信息參
見http://www.innodb.com/manual.php的InnoDB Hot Backup主頁。
不使用Hot Backup工具,最快捷的途徑是使用InnoDB表的二進制快照來關閉主服務器並複製InnoDB數據文
件、日誌文件和表定義文件(.frm文件)。要記錄當前的日誌文件名和偏移量,關閉服務器以前應發出下面的語
句:
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;

而後記錄前面所示的SHOW MASTER STATUS的輸出中顯示的日誌名和偏移量。記錄日誌名和偏移量後,不解
鎖表關閉服務器以確保服務器關閉時的快照與當前的日誌文件和偏移量相對應:
shell> mysqladmin -u root shutdown
適合MyISAM和InnoDB表的另外一個方法是對主服務器上的SQL進行轉儲而不是對前面討論的二進制複製進行轉
儲。爲了實現,能夠在主服務器上使用mysqldump --master-data,之後將SQL轉儲文件裝入從服務器。但
是,這樣比二進制複製要慢一些。
若是主服務器運行時沒有啓用--logs-bin,SHOW MASTER STATUS或mysqldump --master-data顯示的日
志名和位置值爲空。在這種狀況下,當之後指定從服務器的日誌文件和位置時須要使用的值爲空字符串('')和4.
5. 確保主服務器主機上my.cnf文件的[mysqld]部分包括一個log-bin選項。該部分還應有一個serverid=
Master_id選項,其中master_id必須爲1到232–1之間的一個正整數值。例如:
6. [mysqld]
7. log-bin=mysql-bin
8. server-id=1
若是沒有提供那些選項,應添加它們並重啓服務器。
9. 中止用於從服務器的服務器並在其my.cnf文件中添加下面的行:
10. [mysqld]
11. server-id=slave_id
slave_id值同Master_id值同樣,必須爲1到232–1之間的一個正整數值。而且,從服務器的ID必須與主服務器
的ID不相同。例如:
[mysqld]
server-id=2
若是設置多個從服務器,每一個從服務器必須有一個惟一的server-id值,必須與主服務器的以及其它從服務器的
不相同。能夠認爲server-id值相似於IP地址:這些ID值能惟一識別複製服務器羣集中的每一個服務器實例。
若是不指定一個server-id值,若是沒有定義master-host,則將它設置爲1;不然設置爲2。請注意若是serverid
太長,主服務器拒絕全部來自從服務器的鏈接,而且從服務器拒絕鏈接到主服務器。這樣,省略server-id只
適合用二進制日誌備份。
12.若是對主服務器的數據進行二進制備份,啓動從服務器以前將它複製到從服務器的數據目錄中。確保對這
些文件和目錄的權限正確。服務器 MySQL運行的用戶必須可以讀寫文件,如同在主服務器上同樣。
若是使用mysqldum備份,先啓動從服務器(看下一步)。
13.啓動從服務器。若是前面已經複製了,用--skip-slave-start選項啓動從服務器,以便它不當即嘗試鏈接主服
務器。你也可能想要用--logs-warnings選項啓動從服務器(默認設置啓用),以便在錯誤日誌中顯示更多的問題
相關的信息(例如,網絡或鏈接問題)。放棄的鏈接將記入錯誤日誌,除非其值大於1。
14.若是使用mysqldump備份主服務器的數據,將轉儲文件裝載到從服務器:
15. shell> mysql -u root -p < dump_file.sql
16. 在從服務器上執行下面的語句,用你的系統的實際值替換選項值:
17. mysql> CHANGE MASTER TO
18. -> MASTER_HOST='master_host_name',

19. -> MASTER_USER='replication_user_name',
20. -> MASTER_PASSWORD='replication_password',
21. -> MASTER_LOG_FILE='recorded_log_file_name',
22. -> MASTER_LOG_POS=recorded_log_position;
下面的表顯示了字符串選項的最大長度:
Master_Host 60
Master_USER 16
Master_PASSWORD 32
Master_Log_File 255
23.啓動從服務器線程:
24. mysql> START SLAVE;
執行這些程序後,從服務器應鏈接主服務器,並補充自從快照以來發生的任何更新。
若是你忘記設置主服務器的server-id值,從服務器不能鏈接主服務器。
若是你忘記設置從服務器的server-id值,在從服務器的錯誤日誌中會出現下面的錯誤:
Warning: You should set server-id to a non-0 value if master_host is set;
we will force server id to 2, but this MySQL server will not act as a slave.
若是因爲其它緣由不能複製,從服務器的錯誤日誌中也會出現錯誤消息。
從服務器複製時,會在其數據目錄中發現文件dmaster.info和relay-log.info。從服務器使用這兩個文件跟蹤已
經處理了多少主服務器的二進制日誌。不要移除或編輯這些文件,除非你確切知你正在作什麼並徹底理解其意
義。即便這樣,最好是使用CHANGE MASTER TO語句。
註釋:master.info的內容會覆蓋命令行或in my.cnf中指定的部分選項。詳情參見6.8節,「複製啓動選項」。
有了一個快照,你能夠用它根據剛剛描述的從服務器部分來設置其它從服務器。你不須要主服務器的另外一個快
照;每一個從服務器能夠使用相同的快照。
註釋:爲了保證事務InnoDB複製設置的最大可能的耐受性和一致性,應在主服務器的my.cnf文件中使
用innodb_flush_log_at_trx_commit=1和sync-binlog=1。
*
*
*
*
*
複製特性和已知問題
通常原則,SQL級複製兼容性要求主服務器和從服務器均支持使用的特性。例如,在MySQL 5.0.0中開始使
用TIMESTAMPADD()函數。若是在主服務器上使用該函數,不能複製到MySQL 5.0.0以前的從服務器。若是你
計劃在5.1和之前版本的MySQL之間進行復制,你應查閱對應之前版本系列的MySQL參考手冊,查詢該系列復
制特徵相關信息。
下面列出了關於支持什麼和不支持什麼的詳細信息。關於複製的其它InnoDB具體信息參
見15.2.6.5節,「InnoDB和MySQL複製」。
關於保存的程序和觸發器的複製問題在20.4節,「存儲子程序和觸發程序的二進制日誌功能」中討論。
· 用AUTO_INCREMENT、LAST_INSERT_ID()和TIMESTAMP值正確實現複製。
· USER()、UUID()和LOAD_FILE()函數毫無改變地被,這樣不能可靠地在從服務器上工做。
· 下面的限制只適合基於語句的複製,而不是基於行的複製。處理用戶級鎖定的函
數GET_LOCK()、RELEASE_LOCK()、IS_FREE_LOCK()、IS_USED_LOCK()複製時從服務器不知道在主服務器
上同時進行的相關文本;所以若是從服務器上的內容不一樣,這些函數不用來插入到主服務器的表中(例如不執
行INSERT INTO mytable VALUES(GET_LOCK(...)))。
· 在MySQL 5.1中FOREIGN_KEY_CHECKS、SQL_MODE、UNIQUE_CHECKS和SQL_AUTO_IS_NULL變量
均複製。但TABLE_TYPE,即STORAGE_ENGINE變量不復制,有利於在不一樣的存儲引擎之間進行復制。
· 即便主服務器和從服務器有不一樣的全局字符集變量,以及即便有不一樣的全局時區變量仍能夠複製。

· 下面適合使用不一樣字符集的MySQL服務器之間的複製:
1. 必須在主服務器和從服務器上老是使用相同的全局字符集和校對規則(--default-character-set、--defaultcollation)
。不然,會在從服務器上遇到複製鍵值錯誤,由於在主服務器的字符集中被認爲是惟一的鍵值在從服
務器的字符集中可能不是惟一的。
2. 若是主服務器早於MySQL 4.1.3,則會話中的字符集不該與其全局值不一樣(換句話說,不要使用SET
NAMES、SET CHARACTER SET等等),由於從服務器不知道該字符集的更改。若是主服務器和從服務器均
爲4.1.3或更新版,能夠隨便將會話的字符集變量設置爲本地值(例如NAMES、CHARACTER
SET、COLLATION_CLIENT和COLLATION_SERVER),由於這些設定值被寫入二進制日誌,所以從服務器知
道。然而,禁止更改會話中這些變量的全局值;如前面所述,主服務器和從服務器必須具備惟一的全局字符集
值。
3. 若是在主服務器上的數據庫的字符集與全局collation_server值不一樣,則應設計CREATE TABLE語句,以便
它們不隱含依賴數據庫的默認字符集(Bug #2326);一個好的解決辦法是在CREATE TABLE中明顯說明字符集
和校對規則。
· 應在主服務器和從服務器上設置相同的系統時區。不然一些語句,例如使
用NOW()或FROM_UNIXTIME()函數的語句,將不會正確複製。能夠使用腳本mysqld_safe的--
timezone=timezone_name選項或經過設置TZ環境變量設置MySQL服務器運行的系統的時區。主服務器和從服
務器還應有相同的默認鏈接時區設置;即主服務器和從服務器應有相同的--default-time-zone參數值。
· CONVERT_TZ(...,...,@global.time_zone)不能正確複製。只有主服務器和從服務器均爲5.0.4或更新版才
能正確複製CONVERT_TZ(...,...,@session.time_zone)。
· 會話變量只有在更新表的語句中使用時才能正確複製;例如:SET MAX_JOIN_SIZE=1000;INSERT
INTO mytable VALUES(@MAX_JOIN_SIZE)不能將相同的數據插入到主服務器上和從服務器上。不適用於通用
的SET TIME_ZONE=...;INSERT INTO mytable VALUES(CONVERT_TZ(...,...,@time_zone))。
· 能夠將從服務器上的非事務表復爲主服務器上的事務表。例如,能夠將主服務器上的InnoDB表複製爲
從服務器上的MyISAM表。然而,複製過程當中,若是從服務器在BEGIN/COMMIT塊過程當中中止則會產生問題,
由於從服務器在BEGIN塊開始時會重啓。該問題出如今TODO中,不久將會獲得修復。
· 在MySQL 5.1中能夠正確複製引用用戶變量(即@var_name形式的變量)的更新語句;但在4.1之前的版
本中卻不可能。請注意從MySQL 5.1開始對用戶變量名的大小寫再也不敏感;當在5.1和舊版本之間設置複製時應
考慮該問題。
· 從服務器能夠使用SSL鏈接到主服務器。
· 有一個全局系統變量slave_transaction_retries:若是由於某個InnoDB死鎖或超過
InnoDB的innodb_lock_wait_timeout或NDB簇
的TransactionDeadlockDetectionTimeout或TransactionInactiveTimeout,REPLICATION SLAVESQL線程未能
執行某個事務,在給出錯誤中止前自動重試slave_transaction_retries次。默認值是10。從MySQL 5.0.4開始,
能夠從SHOW STATUS的輸出中看到重試總次數;參見5.3.4節,「服務器狀態變量」。
· 若是在主服務器上的CREATE TABLE語句中使用了DATA DIRECTORY或INDEX DIRECTORY子句,子句
也能夠在從服務器上使用。若是在從服務器主機文件系統中不存在一致的目錄或雖然存在但不能被從服務器訪
問,則會帶來問題。MySQL 5.1支持一個稱爲NO_DIR_IN_CREATE的sql_mode選項。若是從服務器運行時
將SQL模式設置爲包括該選項,複製CREATE TABLE語句時將忽略這些子句。結果是在表的數據庫目錄中建立
了MyISAM數據和索引文件。
· 下面的限制只適合基於語句的複製,而不是基於行的複製:若是在查詢中數據修改不肯定,主服務器和
從服務器上的數據能夠不一樣;也就是由查詢優化器肯定。(這是經常使用的但不是很好的習慣,即便不是在複製中
也很差)。關於該問題的詳細解釋,參見A.8.1節,「MySQL中的打開事宜」。

· 帶READ LOCK的FLUSH LOGS、FLUSH MASTER、FLUSH SLAVE和FLUSH TABLES不記入日誌,由於如
果複製到從服務器會形成問題。關於語法示例,參見13.5.5.2節,「FLUSH語法」。FLUSH TABLES、ANALYZE
TABLE、OPTIMIZE TABLE和REPAIR TABLE語句被寫入二進制日誌並會複製到從服務器。通常狀況不會形成問
題,由於這些語句不修改表的數據。可是在某些狀況下會帶來問題。若是你複製mysql數據庫中的受權表而且
不使用GRANT直接更新那些表,必須在從服務器上執行FLUSH PRIVILEGES使新的權限生效。而且,若是使
用FLUSH TABLES從新命名MERGE表的MyISAM表,必須手動在從服務器上執行FLUSH TABLES。若是不指
定NO_WRITE_TO_BINLOG或其別名LOCAL,則這些語句被寫入二進制日誌。
· MySQL只支持一個主服務器和多個從服務器。咱們計劃未來添加一個投票算法,當前的主服務器出現問
題時自動切換。咱們還計劃引入代理過程經過向不一樣的從服務器發送SELECT查詢以幫助進行負載均衡。
· 當服務器關閉、重啓時,其MEMORY表將變爲空。主服務器按下述方法複製該結果:啓動後第1次主服
務器使用每一個MEMORY表,它通知從服務器須要向表寫入DELETE FROM語句來清空二進制日誌的表。詳細信
息參見15.4節,「MEMORY (HEAP)存儲引擎」。
· 除了關閉從服務器(而不只僅是從服務器線程) 臨時表都被複制,而且尚未在從服務器上執行的更新
所使用的臨時表也已經複製。若是關閉從服務器,從服務器重啓後更新須要的那些臨時表不可再用。爲了不
該問題,臨時表打開時不要關閉從服務器。而應遵守下面的程序:
1. 執行STOP SLAVE語句。
2. 使用SHOW STATUS檢查slave_open_temp_tables變量的值。
3. 若是值爲0,使用mysqladmin shutdown命令關閉從服務器。
4. 若是值不爲0,用START SLAVE重啓從服務器線程。
5. 後面再重複該程序看下次的運氣是否好一些。
咱們計劃在不久的未來修復該問題。
· 能夠很安全地鏈接用--logs-slave-updates選項指定的循環主服務器/從服務器關係中的服務器。但請注
意許多語句在這種設置中不能正確工做,除非你的客戶代碼關注了潛在的在不一樣的服務器不一樣順序的更新中可
能發生的這類問題。
這說明你能夠象這樣建立設置:
A -> B -> C -> A
服務器ID被編碼在二進制日誌事件中,所以服務器A知道什麼時候本身首次建立它讀取的事件而且不執行事件(除非
用--replicate-same-server-id選項啓動了服務器A,只在不多狀況下有意義)。這樣,沒有無限循環。只有對錶
執行沒有衝突的更新時該類循環設置才能工做。換句話說,若是在A和C中插入數據,絕對不該在A中插入鍵值
可能與插入到C中的行相沖突的一行。若是更新的順序很重要,還不該更新兩個服務器上相同的行。
· 若是從服務器上的某個語句產生錯誤,則從服務器上的SQL線程終止,而且從服務器向錯誤日誌寫入一
條消息。此時應手動鏈接從服務器,修復該問題(例如,一個不存在的表),而後運行START SLAVE。
· 能夠很安全地關閉主服務器並在之後重啓。若是某個從服務器丟失與主服務器的鏈接,從服務器嘗試立
即從新鏈接。若是失敗,從服務器按期重試。(默認設置是每60秒重試一次。能夠經過--master-connectretry
選項更改)。從服務器也可以處理網絡鏈接中斷。可是,只有從服務器超過slave_net_timeout秒沒有從主
服務器收到數據才通知網絡中斷。若是中斷時間短,能夠下降slave_net_timeout。參見5.3.3節,「服務器系統
變量」。
· 關閉從服務器(淨關閉)也很安全,由於它能夠跟蹤它離開的地點。不純淨的關閉操做會產生問題,特
別是系統關閉前硬盤緩存未刷新到硬盤上時。若是有不間斷電源,能夠大大提升系統容錯能力。不純淨的關閉
主服務器會形成主服務器上的表和二進制日誌內容之間的不一致性;在主服務器上使用InnoDB表和--innodbChapter

safe-binlog選項能夠避免該問題。參見5.11.3節,「二進制日誌」。(註釋:MySQL 5.1中不須要--innodb-safebinlog,
因爲引入了XA事務支持已經做廢了)。
· 因爲MyISAM表的非事務屬性,能夠有一個語句只是更新一個表並返回錯誤代碼。例如,多行插入時有
一個行超過鍵值約束,或者若是長的更新語句更新部分行後被殺掉了。若是發生在主服務器上,除非錯誤代碼
合法而且語句執行產生相同的錯誤代碼,從服務器線程將退出並等待數據庫管理員決定如何作。若是該錯誤代
碼驗證行爲不理想,能夠用--slave-skip-errors選項掩蓋(忽視)部分或所有錯誤。
· 若是從BEGIN/COMMIT系列的非事務表更新事務表,若是提交事務前更新非事務表,對二進制日誌的更
新可能會不一樣步。這是由於事務提交後才被寫入二進制日誌。
· 事務混合更新事務表和非事務表時,二進制日誌中語句的順序是正確的,即便在ROLLBACK時,全部需
要的語句也會寫入二進制日誌。可是若是在第1個鏈接的事務完成前,第2個鏈接更新非事務表,語句記入日誌
時會出現順序錯誤,由於第2個鏈接的更新執行完後當即寫入日誌,而無論第1個鏈接執行的事務的狀態如何
*
*
*
*
若是你的問題是與具體MySQL表達式或函數有關,能夠使用mysql客戶程序所帶的BENCHMARK()函數執行定
時測試。其語法爲BENCHMARK(loop_count,expression)。例如:
mysql> SELECT BENCHMARK(1000000,1+1);
+------------------------+
| BENCHMARK(1000000,1+1) |
+------------------------+
| 0 |
+------------------------+
1 row in set (0.32 sec)
上面結果在PentiumII 400MHz系統上得到。它顯示MySQL在該系統上在0.32秒內能夠執行1,000,000個簡單
的+表達式運算。
全部MySQL函數應該被高度優化,可是總有可能有一些例外。BENCHMARK()是一個找出是否查詢有問題的優
秀的工具
*
*
mysql> ANALYZE TABLE tt;
*
*

*
*
*
鎖定方法
MySQL 5.1支持對MyISAM和MEMORY表進行表級鎖定,對BDB表進行頁級鎖定,對InnoDB表進行行級鎖定。
在許多狀況下,能夠根據培訓猜想應用程序使用哪類鎖定類型最好,但通常很難說出某個給出的鎖類型就比另
一個好。一切取決於應用程序,應用程序的不一樣部分可能須要不一樣的鎖類型。
爲了肯定是否想要使用行級鎖定的存儲引擎,應看看應用程序作什麼而且混合使用什麼樣的選擇和更新語句。
例如,大多數Web應用程序執行許多選擇,而不多進行刪除,只對關鍵字的值進行更新,而且只插入少許具體
的表。基本MySQL MyISAM設置已經調節得很好。
在MySQL中對於使用表級鎖定的存儲引擎,表鎖定時不會死鎖的。這經過老是在一個查詢開始時當即請求全部
必要的鎖定而且老是以一樣的順序鎖定表來管理。
對WRITE,MySQL使用的表鎖定方法原理以下:
若是在表上沒有鎖,在它上面放一個寫鎖。
不然,把鎖定請求放在寫鎖定隊列中。
對READ,MySQL使用的鎖定方法原理以下:
若是在表上沒有寫鎖定,把一個讀鎖定放在它上面。
不然,把鎖請求放在讀鎖定隊列中。
當一個鎖定被釋放時,鎖定可被寫鎖定隊列中的線程獲得,而後是讀鎖定隊列中的線程。
這意味着,若是你在一個表上有許多更新,SELECT語句將等待直到沒有更多的更新。
能夠經過檢查table_locks_waited和table_locks_immediate狀態變量來分析系統上的表鎖定爭奪:
mysql> SHOW STATUS LIKE 'Table%';
+-----------------------+---------+
| Variable_name | Value |
+-----------------------+---------+
| Table_locks_immediate | 1151552 |
| Table_locks_waited | 15324 |
+-----------------------+---------+
若是INSERT語句不衝突,能夠自由爲MyISAM表混合並行的INSERT和SELECT語句而不須要鎖定。也就是說,
你能夠在其它客戶正讀取MyISAM表的時候插入行。若是數據文件中間不包含空閒塊,不會發生衝突,由於在
這種狀況下,記錄老是插入在數據文件的尾部。(從表的中部刪除或更新的行可能致使空洞)。若是有空洞,
當全部空洞填入新的數據時,並行的插入可以從新自動啓用。
若是不能同時插入,爲了在一個表中進行屢次INSERT和SELECT操做,能夠在臨時表中插入行而且當即用臨時
表中的記錄更新真正的表。
這可用下列代碼作到:
mysql> LOCK TABLES real_table WRITE, insert_table WRITE;
mysql> INSERT INTO real_table SELECT * FROM insert_table;
mysql> TRUNCATE TABLE insert_table;
mysql> UNLOCK TABLES;
InnoDB使用行鎖定,BDB使用頁鎖定。對於這兩種存儲引擎,均可能存在死鎖。這是由於,在SQL語句處理期
間,InnoDB自動得到行鎖定和BDB得到頁鎖定,而不是在事務啓動時得到。
行級鎖定的優勢:
· 當在許多線程中訪問不一樣的行時只存在少許鎖定衝突。
· 回滾時只有少許的更改。
· 能夠長時間鎖定單一的行。
行級鎖定的缺點:
· 比頁級或表級鎖定佔用更多的內存。
· 當在表的大部分中使用時,比頁級或表級鎖定速度慢,由於你必須獲取更多的鎖。
· 若是你在大部分數據上常常進行GROUP BY操做或者必須常常掃描整個表,比其它鎖定明顯慢不少。
· 用高級別鎖定,經過支持不一樣的類型鎖定,你也能夠很容易地調節應用程序,由於其鎖成本小於行級鎖
定。
在如下狀況下,表鎖定優先於頁級或行級鎖定:
· 表的大部分語句用於讀取。
· 對嚴格的關鍵字進行讀取和更新,你能夠更新或刪除能夠用單一的讀取的關鍵字來提取的一行:
· UPDATE tbl_name SET column=value WHERE unique_key_col=key_value;
· DELETE FROM tbl_name WHERE unique_key_col=key_value;
· SELECT 結合並行的INSERT語句,而且只有不多的UPDATE或DELETE語句。

· 在整個表上有許多掃描或GROUP BY操做,沒有任何寫操做。
不一樣於行級或頁級鎖定的選項:
· 版本(例如,爲並行的插入在MySQL中使用的技術),其中能夠一個寫操做,同時有許多讀取操做。這說
明數據庫或表支持數據依賴的不一樣視圖,取決於訪問什麼時候開始。其它共同的術語是「時間跟蹤」、「寫複製」或
者「按需複製」。
· 按需複製在許多狀況下優先於頁級或行級鎖定。然而,在最壞的狀況下,它可能比使用常規鎖定使用更
多的內存。
· 除了行級鎖定外,你能夠使用應用程序級鎖定,例如在MySQL中使
用GET_LOCK()和RELEASE_LOCK()。這些是建議性鎖定,它們只能在運行良好的應用程序中工做。
*
*
*
*
*
MyISAM鍵高速緩衝

爲了使硬盤I/O最小化,MyISAM存儲引擎使用一個被許多數據庫管理系統使用的策略。它使用一個緩存機制將
常常訪問的表鎖在內存中:
Chapter 7. Optimization
file:///D:/download/refman-5.1-zh.html-chapter/refman-5.1-zh.html-chapter/optimization.html[2010/2/24 5:22:07]
· 對於索引塊,維護一個稱之爲鍵高速緩衝(或鍵高速緩衝區)的特殊結構。該結構包含大量塊緩存區,其
中放置了最經常使用的索引塊。
· 對於數據塊,MySQL不使用特殊緩存。而使用原生的操做系統文件系統的緩存。
本節首先描述了MyISAM鍵高速緩衝的基本操做。而後討論了提升鍵高速緩衝性能並使你更好地控制緩存操做
的最新的更改:
· 多個線程能夠並行訪問緩存。
· 能夠設置多個鍵高速緩衝,並將表索引指定給具體緩存。
能夠使用key_buffer_size系統變量控制鍵高速緩衝的大小。若是該變量設置爲零,不使用鍵高速緩衝。如
果key_buffer_size值過小不能分配最小數量的塊緩存區(8),也不使用鍵高速緩衝。
若是鍵高速緩衝不工做,只使用操做系統提供的原生文件系統緩存區訪問索引文件。(換句話說,使用與表數
據塊相同的策略表來訪問索引塊)。
索引塊是一個連續的訪問MyISAM索引文件的單位。一般一個索引塊的大小等於索引B-樹節點的大小。(在硬盤
上使用B-樹數據結構表示索引。樹底部的節點爲葉子節點。葉子節點上面的節點爲非葉子節點)。
鍵高速緩衝結構中的全部塊緩存區大小相同。該大小能夠等於、大於或小於表索引塊的大小。一般這兩個值中
的一個是另外一個的幾倍。
當必須訪問表索引塊中的數據時,服務器首先檢查是否它能夠用於鍵高速緩衝中的某些塊緩存區。若是適用,
服務器訪問鍵高速緩衝中的數據而不是硬盤上的數據。也就是說,從緩存讀取或寫入緩存,而不是從硬盤讀
寫。不然,服務器選擇一個包含一個不一樣的表索引塊的緩存塊緩存區,並用須要的表索引塊的拷貝替換那裏的
數據。一旦新的索引塊位於緩存中,能夠訪問索引數據。
若是用於替換的塊已經被修改了,塊被視爲「髒了」。在這種狀況下,在替換前,其內容被刷新到它來自的表索
引。
一般服務器聽從LRU(最近最少使用)策略:當選擇一個塊用於替換時,它選擇最近最少使用的索引塊。爲了使
該選擇更容易, 鍵高速緩衝模塊維護全部使用的塊的專門隊列(LRU鏈)。當訪問塊時,它被放到隊列最後。當
塊須要替換時,隊列開頭的塊是最近最少使用的塊,併成爲第1個候選者。
7.4.6.1. 共享鍵高速緩衝訪問
在如下條件下,線程能夠同時訪問鍵高速緩衝緩存區:
· 沒有被更新的緩存區能夠被多個線程訪問。
· 正被更新的緩存區讓須要使用它的線程等待直到更新完成。
· 多個線程能夠發起請求替換緩存塊,只要它們不彼此干擾(也就是說,只要它們須要不一樣的索引塊,並
且使不一樣的緩存塊被替換)。
對鍵高速緩衝的共享訪問容許服務器大大提升吞吐量。
7.4.6.2. 多鍵高速緩衝
對鍵高速緩衝的共享訪問能夠提升性能但不能徹底消除線程之間的竟爭。它們仍然競爭對鍵高速緩衝緩存區的
訪問進行管理的控制結構。爲了進一步下降鍵高速緩衝訪問竟爭,MySQL 5.1還提供了多個鍵高速緩衝,容許
你爲不一樣的鍵高速緩衝分配不一樣的表索引。

有多個鍵高速緩衝時,當爲給定的MyISAM表處理查詢時,服務器必須知道使用哪一個緩存。默認狀況,所
有MyISAM表索引被緩存到默認鍵高速緩衝中。要想爲具體鍵高速緩衝分配表索引,應使用CACHE INDEX語
句(參見13.5.5.1節,「CACHE INDEX語法」)。
例如,下面的語句將表t一、t2和t3的索引分配給名爲hot_cache的鍵高速緩衝:
mysql> CACHE INDEX t1, t2, t3 IN hot_cache;
+---------+--------------------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+---------+--------------------+----------+----------+
| test.t1 | assign_to_keycache | status | OK |
| test.t2 | assign_to_keycache | status | OK |
| test.t3 | assign_to_keycache | status | OK |
+---------+--------------------+----------+----------+
能夠用SET GLOBAL參數設置語句或使用服務器啓動選項設置在CACHE INDEX語句中引用的鍵高速緩衝的大小
來建立鍵高速緩衝。例如:
mysql> SET GLOBAL keycache1.key_buffer_size=128*1024;
要想刪除鍵高速緩衝,將其大小設置爲零:
mysql> SET GLOBAL keycache1.key_buffer_size=0;
請注意不能刪除默認鍵高速緩衝。刪除默認鍵高速緩衝的嘗試將被忽略:
mysql> set global key_buffer_size = 0;
mysql> show variables like 'key_buffer_size';
+-----------------+---------+
| Variable_name | Value |
+-----------------+---------+
| key_buffer_size | 8384512 |
+-----------------+---------+
鍵高速緩衝變量是結構式系統變量,有一個名和組件。對於keycache1.key_buffer_size,keycache1是緩存變
量名,key_buffer_size是緩存組件。關於引用結構式鍵高速緩衝系統變量所使用的語法的描述,參
見9.4.1節,「結構式系統變量」
默認狀況下,表索引被分配給服務器啓動時建立的主要(默認)鍵高速緩衝。當鍵高速緩衝被刪除後,全部分配
給它的索引被從新分配給默認鍵高速緩衝。
對於一個忙的服務器,咱們建議採用使用三個鍵高速緩衝的策略:
· 佔用爲全部鍵高速緩衝分配的空間的20%的「熱」鍵高速緩衝。該緩存用於頻繁用於搜索但沒有更新的
表。
· 佔用爲全部鍵高速緩衝分配的空間的20%的「冷」鍵高速緩衝。該緩存用於中等大小、大量修改的表,例

如臨時表。
· 佔用鍵高速緩衝空間的20%的「溫」鍵高速緩衝。使用它做爲默認鍵高速緩衝,默認狀況被全部其它表
使用。
使用3個鍵高速緩衝有好處的一個緣由是對一個鍵高速緩衝結構的訪問不會阻擋對其它的訪問。訪問分配給一
個緩存的表的查詢不會與訪問分配給其它緩存的表的查詢競爭。因爲其它緣由也會提升性能:
· 熱緩存只用於檢索查詢,所以其內容決不會被修改。結果是,不管什麼時候須要從硬盤上拉入索引塊,選擇
用於替換的緩存塊的內容不須要先刷新。
· 對於分配給熱緩存的索引,若是沒有查詢須要索引掃描,頗有可能對應索引B-樹的非葉子節點的索引塊
仍然在緩存中。
· 當更新的節點位於緩存中而且不須要先從硬盤讀入時,爲臨時表頻繁執行的更新操做會執行得更快。如
果臨時表的索引的大小能夠與冷鍵高速緩衝相比較,極可能更新的節點位於緩存中。
CACHE INDEX在一個表和鍵高速緩衝之間創建一種聯繫,但每次服務器重啓時該聯繫被丟失。若是你想要每
次服務器重啓時該聯繫生效,一個發辦法是使用選項文件:包括配置鍵高速緩衝的變量設定值,和一個initfile
選項用來命名包含待執行的CACHE INDEX語句的一個文件。例如:
key_buffer_size = 4G
hot_cache.key_buffer_size = 2G
cold_cache.key_buffer_size = 2G
init_file=/path/to/data-directory/mysqld_init.sql
每次服務器啓動時執行mysqld_init.sql中的語句。該文件每行應包含一個SQL語句。下面的例子分配幾個表,
分別對應hot_cache和cold_cache:
CACHE INDEX a.t1, a.t2, b.t3 IN hot_cache
CACHE INDEX a.t4, b.t5, b.t6 IN cold_cache
7.4.6.3. 中點插入策略
默認狀況,鍵高速緩衝管理系統採用LRU策略選擇要收回的鍵高速緩衝塊,但它也支持更復雜的方法,稱之
爲「中點插入策略」。
當使用中點插入策略時,LRU鏈被分爲兩個部分:一條熱子鏈和一條溫子鏈。兩部分之間的劃分點不固定,但
鍵高速緩衝管理系統關注溫部分不「過短」,老是包含至少key_cache_division_limit比例的鍵高速緩衝
塊。key_cache_division_limit是結構式鍵高速緩衝變量的一個組件,所以其值是一個能夠根據每一個緩存進行設
置的參數。
當一個索引塊從表中讀入鍵高速緩衝,它被放入溫子鏈的末端。通過必定量的訪問後(訪問塊),它被提高給熱
子鏈。目前,須要用來提高一個塊(3)的訪問次數與全部索引塊的相同。
提高到熱子鏈的塊被放到子鏈的末端。塊而後在該子鏈中循環。若是塊在子鏈的開頭停留足夠長的時間,它被
降到溫鏈。該時間由鍵高速緩衝key_cache_age_threshold組件的值肯定。
對於包含N個塊的鍵高速緩衝,閾值表示,熱子鏈開頭的沒有在最後N *key_cache_age_threshold/100次訪問
中被訪問的塊將被移動到溫子鏈開頭。該塊而後變爲第1個擠出的候選者,由於替換的塊老是來自溫子鏈的開
頭。
中點插入策略容許你將更有價值的塊老是在緩存中。若是你想使用簡單的LRU策略,
使key_cache_division_limit值保持其默認值100。

若執行的查詢要求索引掃描有效推出全部索引塊對應有數值的高級B-樹節點的緩存,中點插入策略能夠幫助提
高性能。要想避免,必須使用中點插入策略,而key_cache_division_limit設置爲遠小於100。而後在索引掃描
操做過程當中,有數值的常常訪問的節點被保留在熱子鏈中。
7.4.6.4. 索引預加載
若是鍵高速緩衝內有足夠的塊以容納整個索引的塊,或者至少容納對應其非葉節點的塊,則在使用前,預裝含
索引塊的鍵高速緩衝頗有意義。預裝能夠以更有效的方式將表索引塊放入鍵高速緩衝緩存區中:經過順序地從
硬盤讀取索引塊。
不進行預裝,塊仍然根據查詢須要放入鍵高速緩衝中。儘管塊將仍然在緩存中(由於有足夠的緩存區保存它
們),它們以隨機方式從硬盤上索取,而不是以順序方式。
要想將索引預裝到緩存中,使用LOAD INDEX INTO CACHE語句。例如,下面的語句能夠預裝表t1和t2索引的
節點(索引塊):
mysql> LOAD INDEX INTO CACHE t1, t2 IGNORE LEAVES;
+---------+--------------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+---------+--------------+----------+----------+
| test.t1 | preload_keys | status | OK |
| test.t2 | preload_keys | status | OK |
+---------+--------------+----------+----------+
IGNORE LEAVES修改器只容許預裝索引非葉節點所用的塊。這樣,上述的語句預裝t1中的全部索引塊,但只預
裝t2中的非葉節點對應的塊。
若是已經使用CACHE INDEX語句爲一個索引分配了一個鍵高速緩衝,預裝能夠將索引塊放入該緩存。不然,索
引被裝入默認鍵高速緩衝。
7.4.6.5. 鍵高速緩衝塊大小
能夠使用key_cache_block_size變量爲具體的鍵高速緩衝指定塊緩存區的大小。這樣容許爲索引文件調
節I/O操做的性能。
當讀緩存區的大小等於原生操做系統I/O緩存區的大小時,能夠得到I/O操做的最佳性能。可是將關鍵字節點的
大小設置爲等於I/O緩存區的大小並不老是能保證最佳總體性能。當讀取大的葉節點時,服務器讀入大量的不
須要的數據,結果防止讀入其它葉子的節點。
目前,你不能控制表內索引塊的大小。該大小由服務器在建立.MYI索引文件時設置,取決於表定義中索引的關
鍵字大小。在大多數狀況下,它被設置爲與I/O緩存區大小相等。
7.4.6.6. 重構鍵高速緩衝
鍵高速緩衝能夠經過更新其參數值隨時從新構建。例如:
mysql> SET GLOBAL cold_cache。key_buffer_size=4*1024*1024;
若是你爲key_buffer_size或key_cache_block_size鍵高速緩衝組件分配的值與組件當前的值不一樣,服務器將毀
掉緩存的舊結構並根據新值建立一個新的。若是緩存包含任何髒的塊,服務器在銷燬前將它們保存到硬盤上並
從新建立緩存。若是你設置其它鍵高速緩衝參數,則不會發生從新構建。

當從新構建鍵高速緩衝時,服務器首先將任何髒緩存區的內容刷新到硬盤上。以後,緩存內容再也不須要。然
而,從新構建並不阻塞須要使用分配給緩存的索引的查詢。相反,服務器使用原生文件系統緩存直接訪問表索
引。文件系統緩存不如使用鍵高速緩衝有效,所以儘管查詢能夠執行,但速度會減慢。緩存被從新構建後,它
又能夠緩存分配給它的索引了,而且索引再也不使用文件系統緩存。
*
*
*
MySQL如何計算打開的表
當運行mysqladmin status時,將看見象這樣的一些東西:
Uptime: 426 Running threads: 1 Questions: 11082
Reloads: 1 Open tables: 12
若是你僅有6個表,Open tables值爲12可能有點使人困惑。
MySQL是多線程的,所以許多客戶能夠同時在同一個表上進行查詢。爲了使多個客戶線程在同一個表上有不
同狀態的問題減到最小,表被每一個併發進程獨立地打開。這樣須要額外的內存但通常會提升性能。對
於MyISAM表,數據文件須要爲每一個打開表的客戶提供一個額外的文件描述符。(索引文件描述符在全部線程之
間共享)。
*
*
*
MySQL如何使用DNS
當新的客戶鏈接mysqld時,mysqld建立一個新的線程來處理請求。該線程先檢查是否主機名在主機名緩存
中。若是不在,線程試圖解析主機名:

· 若是操做系統支持線程安全gethostbyaddr_r ()和gethostbyname_r()調用,線程使用它們來執行主機名
解析。
· 若是操做系統不支持線程安全調用,線程鎖定一個互斥體並調用gethostbyaddr()和gethostbyname()。
在這種狀況下,在第1個線程解鎖互斥體前,沒有其它線程能夠解析不在主機名緩存中的主機名。
你能夠用--skip-name-resolve選項啓動mysqld來禁用DNS主機名查找。然而,在這種狀況下,你只能夠使
用MySQL中的受權表中的IP號。
若是你有一個很慢的DNS和許多主機,你能夠經過用--skip-name-resolve禁用DNS查找或增
加HOST_CACHE_SIZE定義(默認值:128)並從新編譯mysqld來提升性能。
你能夠用--skip-host-cache選項啓動服務器來禁用主機名緩存。要想清除主機名緩存,執行FLUSH HOSTS語句
或執行mysqladmin flush-hosts命令。
若是你想要徹底禁止TCP/IP鏈接,用--skip-networking選項啓動mysqld。
*
*
*
*
*
磁盤事宜
7.6.1. 使用符號連接
· 磁盤搜索是巨大的性能瓶頸。當數據量變得很是大以至於緩存性能變得不可能有效時,該問題變
得更加明顯。對於大數據庫,其中你或多或少地隨機訪問數據,你能夠確信對讀取操做須要至少一次硬
盤搜索,寫操做須要屢次硬盤搜索。要想使該問題最小化,應使用搜索次數較少的磁盤。
· 經過連接文件到不一樣的磁盤或對硬盤分段來增長可用磁盤錠數量(所以下降搜索成本):
o 使用符號連接
這說明,對於MyISAM表,你符號連接索引文件和/或數據文件,從它們數據目錄內的一般位置到另外一個
硬盤(也能夠被條紋化)。這將使搜索和讀次數達到最好,假定硬盤再也不爲其它目的使用。參
見7.6.1節,「使用符號連接」。
o 分條
分條意味着你有許多磁盤,將第1個塊放到第1個硬盤,第2個塊放到第2個磁盤,而且第N塊在(N mod
number_of_disks)磁盤上等等。這意味着若是正常數據大小小於分條大小(或徹底匹配),可以獲得最
佳性能。分條徹底取決於操做系統和分條大小,所以用不一樣的條紋大小對應用程序進行基準測試。參
見7.1.5節,「使用本身的基準」。
分條的不一樣速度徹底依賴於參數。依賴於怎樣設置條紋參數和硬盤數量,能夠根據不一樣數量級別獲得不
同的標準。你必須進行選擇以便優化隨機或順序存取。
· 爲了高可靠性你可能想使用RAID 0+1(條紋加鏡像),但在這種狀況下,須要2*N塊磁盤來保
持N個磁盤的數據。若是你肯爲它花錢,這多是最好的選項。然而,你可能還必須投資一部分資金到卷
管理軟件中以便有效地管理它。
· 一個較好的選擇是根據數據類型的重要性程度改變RAID級別。例如,保存能夠在RAID 0硬盤上重
新生成的不過重要的數據,但保存真正重要數據(例如主機信息和日誌)到RAID 0+1或RAID N硬盤。
若是你有許多寫操做,RAID N可能會存在問題,由於須要時間來更新校驗位。
· 在Linux上,經過配置磁盤接口時使用hdparm,你能夠得到更多的性能。(在通常負載下達
到100%並不困難。)下面的hdparm選項應該很是適用於MySQL,而且可能適用於許多其它應用程序:
hdparm -m 16 -d 1

請注意,當使用該命令時,性能和可靠性依賴於硬件,所以咱們強烈建議,使用hdparm後,徹底測試你
的系統。爲獲取更多詳細信息,請查閱hdparm手冊幫助頁。若是hdparm使用的很差,會致使文件系統
破壞,所以試驗以前請作好每一個備份!
· 也能夠設置數據庫使用的文件系統參數:
若是不須要知道文件最後一次訪問的時間(這對數據庫服務器並無實際的用途),能夠用-o noatime選
項安裝文件系統。這將跳過對文件系統中的節點的最後一次訪問時間的更新,從而可以避免一些硬盤搜
索。
在許多操做系統中,用-o async選項安裝,能夠將文件系統設置爲異步更新。若是電腦至關穩定,這應該
給予你更高的性能而不須要犧牲太多的可靠性。(該標誌是Linux中默認開啓。)
*
*
*
客戶端腳本和實用工具概述
下面簡單列出了MySQL客戶端程序和實用工具:
· myisampack
壓縮MyISAM表以產生更小的只讀表的一個工具。參見8.2節,「myisampack:生成壓縮、只讀MyISAM表」。
· mysql
交互式輸入SQL語句或從文件以批處理模式執行它們的命令行工具。參見8.3節,「mysql:MySQL命令行工具」。
· mysqlaccess
檢查訪問主機名、用戶名和數據庫組合的權限的腳本。
· mysqladmin
執行管理操做的客戶程序,例如建立或刪除數據庫,重載受權表,將表刷新到硬盤上,以及從新打開日誌文
件。mysqladmin還能夠用來檢索版本、進程,以及服務器的狀態信息。參見8.5節,「mysqladmin:用於管
理MySQL服務器的客戶端」。

· mysqlbinlog
從二進制日誌讀取語句的工具。在二進制日誌文件中包含的執行過的語句的日誌可用來幫助從崩潰中恢復。參
見8.6節,「mysqlbinlog:用於處理二進制日誌文件的實用工具」。
· mysqlcheck
檢查、修復、分析以及優化表的表維護客戶程序。參見8.7節,「mysqlcheck:表維護和維修程序」。
· mysqldump
將MySQL數據庫轉儲到一個文件(例如SQL語句或tab分隔符文本文件)的客戶程序。加強版免費軟件首先
由Igor Romanenko提供。參見8.8節,「mysqldump:數據庫備份程序」。
· mysqlhotcopy
當服務器在運行時,快速備份MyISAM或ISAM表的工具。參見8.9節,「mysqlhotcopy:數據庫備份程序」。
· mysql import
使用LOAD DATA INFILE將文本文件導入相關表的客戶程序。參見8.10節,「mysqlimport:數據導入程序」。
· mysqlshow
顯示數據庫、表、列以及索引相關信息的客戶程序。參見8.11節,「mysqlshow:顯示數據庫、表和列信息」。
· perror
顯示系統或MySQL錯誤代碼含義的工具。參見8.13節,「perror:解釋錯誤代碼」。
· replace
更改文件中或標準輸入中的字符串的實用工具。參見8.14節,「replace:字符串替換實用工具」。
MySQL AB還提供了大量GUI工具用於管理和MySQL服務器的其它工做。相關基本信息參見第4章:MySQL程序
概述。
每一個MySQL程序有許多不一樣的選項。但每一個MySQL程序均提供一個---help選項,能夠用來全面描述程序不一樣的
選項。例如,能夠試試mysql---help。
使用mysqlclient庫同服務器進行通信的MySQL客戶使用下面的環境變量:
MYSQL_UNIX_PORT 默認Unix套接字文件;用於鏈接localhost
MYSQL_TCP_PORT 默認端口號;用於TCP/IP鏈接
MYSQL_PWD 默認密碼
MYSQL_DEBUG 調試過程當中的調試跟蹤選項
TMPDIR 建立臨時表和文件的目錄
使用MYSQL_PWD不安全。參見5.8.6節,「使你的密碼安全」。
能夠在選項文件中或在命令行中指定選項來替換全部標準程序的默認選項值或指定的環境變量的值
*
*
*
*
*
*
mysql技巧
8.3.4.1. 垂直顯示查詢結果
一些查詢結果若是垂直顯示而不用一般的水平表格式顯示,則更容易讀取。用\G而不用分號結束查詢能夠垂直
顯示查詢。例如,包括新行的更長的文本值垂直輸出時一般更容易讀取:
mysql> SELECT * FROM mails WHERE LENGTH(txt) < 300 LIMIT 300,1\G
*************************** 1. row ***************************
msg_nro: 3068
date: 2000-03-01 23:29:50
time_zone: +0200
mail_from: Monty
reply: monty@no.spam.com
mail_to: "Thimble Smith" <tim@no.spam.com>
sbj: UTF-8
Chapter 8. Client and Utility Programs
file:///D:/download/refman-5.1-zh.html-chapter/refman-5.1-zh.html-chapter/client-side-scripts.html[2010/2/24 5:22:14]
txt: >>>>> "Thimble" == Thimble Smith writes:
Thimble> Hi. I think this is a good idea. Is anyone familiar
Thimble> with UTF-8 or Unicode? Otherwise, I'll put this on my
Thimble> TODO list and see what happens.
Yes, please do that.
Regards,
Monty
file: inbox-jani-1
hash: 190402944
1 row in set (0.09 sec)
8.3.4.2. 使用--safe-updates選項
對於新手,有一個有用的啓動選項--safe-updates(或--i-am-a-dummy,具備相同的效果)。當你已經發出一
個DELETE FROM tbl_name語句但忘記了WHERE子句時頗有用。一般狀況,這樣的語句從表中刪除全部行。用-
-safe-updates,能夠經過指定能夠識別它們的鍵值只刪除某些行。這樣能夠幫助防止事故。
若使用--safe-updates選項,mysql鏈接MySQL服務器時發出下面的語句:
SET SQL_SAFE_UPDATES=1,SQL_SELECT_LIMIT=1000, SQL_MAX_JOIN_SIZE=1000000;
參見13.5.3節,「SET語法」。
SET語句有下面的效果:
· 不容許你執行UPDATE或DELETE語句,除非在WHERE子句中指定一個鍵值約束或提供一個LIMIT子
句(或兩者皆使用)。例如:
· UPDATE tbl_name SET not_key_column=val WHERE key_column=val;
·
· UPDATE tbl_name SET not_key_column=val LIMIT 1;
· 全部大的SELECT結果自動限制到1,000行,除非語句包括一個LIMIT子句。
· 放棄可能須要檢查1,000,000多行組合的多表SELECT語句。
要將限制指定爲1,000和1,000,000以外的值,能夠使用--select_limit和--max_join_size選項覆蓋默認值:
shell> mysql --safe-updates --select_limit=500 --max_join_size=10000
8.3.4.3. 禁用mysql自動鏈接
若是mysql客戶程序發送查詢時斷開與服務器的鏈接,它當即並自動嘗試從新鏈接服務器並再次發送查詢。然
而,即便mysql從新鏈接成功,你的第1個鏈接也已經結束,而且之前的會話對象和設定值被丟失:包括臨時
表、自動提交模式,以及用戶和會話變量。該行爲很危險,以下面的例子所示,服務器將在你不知道的狀況下
關閉並重啓:
mysql> SET @a=1;
Query OK, 0 rows affected (0.05 sec)
mysql> INSERT INTO t VALUES(@a);
ERROR 2006: MySQL server has gone away
No connection. Trying to reconnect...

Connection id: 1
Current database: test
Query OK, 1 row affected (1.30 sec)
mysql> SELECT * FROM t;
+------+
| a |
+------+
| NULL |
+------+
1 row in set (0.05 sec)
@a用戶變量已經隨鏈接丟失,而且從新鏈接後它也沒有定義。若是有必要在鏈接斷開時終止mysql並提示錯
誤,你能夠用--skip-reconnect選項啓動mysql客戶程序
*
*
mysql_zap:殺死符合某一模式的進程
mysql_zap殺死匹配某一模式的進程。象這樣調用它:
shell> mysql_zap [-signal] [-?Ift] pattern
若是進程的ps命令的輸出行包含該模式,則認爲其匹配。默認狀況,mysql_zap對每一個進程請求確認。響
應y則殺死該進程,或者q退出mysql_zap。對於其它響應,mysql_zap不試圖殺死進程。
若是給出-signal選項,它指定發送到每一個進程的信號名或信號編號。不然,mysql_zap首先嚐試TERM(信
號15)而後用KILL(信號9)。
mysql_zap理解下面的額外選項:
· ---help,-?,-I
顯示一條幫助消息並退出。

· -f
強制模式。mysql_zap 視圖殺死每一個匹配的進程而不須要確認。
· -t
測試模式。顯示每一個進程的信息但不殺死它。
*
*
*
*
*
*
*
*
在MySQL中,下表中的字顯式被保留。其中大多數字進制被標準SQL用做列名和/或表名(例如,GROUP)。少
數被保留了,由於MySQL須要它們,(目前)使用yacc解析程序。保留字被引發來後能夠用做識別符。
ADD ALL ALTER
ANALYZE AND AS
ASC ASENSITIVE BEFORE
BETWEEN BIGINT BINARY
BLOB BOTH BY
CALL CASCADE CASE
CHANGE CHAR CHARACTER
CHECK COLLATE COLUMN
CONDITION CONNECTION CONSTRAINT
CONTINUE CONVERT CREATE
CROSS CURRENT_DATE CURRENT_TIME
CURRENT_TIMESTAMP CURRENT_USER CURSOR
DATABASE DATABASES DAY_HOUR
DAY_MICROSECOND DAY_MINUTE DAY_SECOND
DEC DECIMAL DECLARE
DEFAULT DELAYED DELETE
DESC DESCRIBE DETERMINISTIC
DISTINCT DISTINCTROW DIV
DOUBLE DROP DUAL
EACH ELSE ELSEIF
ENCLOSED ESCAPED EXISTS
EXIT EXPLAIN FALSE
FETCH FLOAT FLOAT4
FLOAT8 FOR FORCE
FOREIGN FROM FULLTEXT
GOTO GRANT GROUP
HAVING HIGH_PRIORITY HOUR_MICROSECOND
HOUR_MINUTE HOUR_SECOND IF
IGNORE IN INDEX
INFILE INNER INOUT
Chapter 9. Language Structure
file:///D:/download/refman-5.1-zh.html-chapter/refman-5.1-zh.html-chapter/language-structure.html[2010/2/24 5:22:18]
INSENSITIVE INSERT INT
INT1 INT2 INT3
INT4 INT8 INTEGER
INTERVAL INTO IS
ITERATE JOIN KEY
KEYS KILL LABEL
LEADING LEAVE LEFT
LIKE LIMIT LINEAR
LINES LOAD LOCALTIME
LOCALTIMESTAMP LOCK LONG
LONGBLOB LONGTEXT LOOP
LOW_PRIORITY MATCH MEDIUMBLOB
MEDIUMINT MEDIUMTEXT MIDDLEINT
MINUTE_MICROSECOND MINUTE_SECOND MOD
MODIFIES NATURAL NOT
NO_WRITE_TO_BINLOG NULL NUMERIC
ON OPTIMIZE OPTION
OPTIONALLY OR ORDER
OUT OUTER OUTFILE
PRECISION PRIMARY PROCEDURE
PURGE RAID0 RANGE
READ READS REAL
REFERENCES REGEXP RELEASE
RENAME REPEAT REPLACE
REQUIRE RESTRICT RETURN
REVOKE RIGHT RLIKE
SCHEMA SCHEMAS SECOND_MICROSECOND
SELECT SENSITIVE SEPARATOR
SET SHOW SMALLINT
SPATIAL SPECIFIC SQL
SQLEXCEPTION SQLSTATE SQLWARNING
SQL_BIG_RESULT SQL_CALC_FOUND_ROWS SQL_SMALL_RESULT
SSL STARTING STRAIGHT_JOIN
TABLE TERMINATED THEN
TINYBLOB TINYINT TINYTEXT
TO TRAILING TRIGGER
TRUE UNDO UNION
UNIQUE UNLOCK UNSIGNED
UPDATE USAGE USE
USING UTC_DATE UTC_TIME
UTC_TIMESTAMP VALUES VARBINARY
VARCHAR VARCHARACTER VARYING
Chapter 9. Language Structure
file:///D:/download/refman-5.1-zh.html-chapter/refman-5.1-zh.html-chapter/language-structure.html[2010/2/24 5:22:18]
WHEN WHERE WHILE
WITH WRITE X509
XOR YEAR_MONTH ZEROFILL
MySQL容許部分關鍵字用作未引發來的識別符,由於許多人之前曾使用過它們。下面列出了一些例子:
ACTION
BIT
DATE
ENUM
NO
TEXT
TIME
TIMESTAMP
*
*
*
*
*

*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 



*
*
*
* mysql內置函數
* 時間類型字段
mysql> select YEAR('2013-08-11');
+--------------------+
| YEAR('2013-08-11') |
+--------------------+
| 2013 |
+--------------------+
注意時間戳不行
*
*
* mysql> select month('2013-08-11');
+---------------------+
| month('2013-08-11') |
+---------------------+
| 8 |
+---------------------+
1 row in set (0.00 sec)
*
*
* mysql> select day('2013-08-11');
+-------------------+
| day('2013-08-11') |
+-------------------+
| 11 |
+-------------------+
*
* 從最右邊取5個長度
* mysql> select right('2015-05-15',5);
+-----------------------+
| right('2015-05-15',5) |
+-----------------------+
| 05-15 |
+-----------------------+
*
*
*
* 從最左邊取4個長度
* mysql> select left('2015-05-15',4);
+----------------------+
| left('2015-05-15',4) |
+----------------------+
| 2015 |
+----------------------+
*
*
*
*
*
*/

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

<?php

//mysql語句使用技巧

/*
 * 個人數據庫是5.5.2
 * 
 * 查詢當前用戶的登錄的名字
 * select user();
 * 
 * 查詢當前mysql服務器時間和服務器版本
 * select version(),current_time;
 * 
 * 
 * 修改一個字段的屬性
 * 
 * 
 * 查看mysql數據庫的user表,查看受權用戶
 * use user;
 * select host,user,password from user;
 * 
 * 在shell 或者dos下登錄mysql
 * 2者都須要吧mysql命令加入服務,或者切換到對應的目錄下
 * mysql -h 127.0.0.1 -u root -p root 
 * 
 * 查詢全部數據庫
 *  show databases;
 * 
 * 查詢全部表
 * show tables;
 * 
 * 
 * 修改表名字,表字段屬性
 * ALTER TABLE  `shopnc_address` CHANGE  `address`  `address1` VARCHAR( 2000 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT  '地址'
 *                                       原表名      新表名      字段屬性和長度改變       字符集                                爲NULL 
 * 
 * 
 * 
 * 受權
 * GRANT ALL PRIVILEGES    ON         *.*        TO 'zx'@'localhost' IDENTIFIED BY 'zx123456' WITH GRANT OPTION;
 *       全部權限                 數據庫.表           用戶名    host主機                   密碼
 * 
 * 刷新權限
 * FLUSH PRIVILEGES;
 * 
 * 查看用戶受權
 * show grants for user_name;多是由於版本緣由不能顯示
 * 
 * 
 * --safe-user-create
若是啓用,用戶不能用GRANT語句建立新用戶,除非用戶有mysql.user表的INSERT權限。若是你想讓用戶具備受權權限來建立新用戶,你應給用戶授予下面
的權限:
 * GRANT INSERT(user) ON mysql.user TO 'user_name'@'host_name';
 * 
 * 
 * 
 * 收回權限
 * REVOKE ALL PRIVILEGES ON *.* FROM myuser;  
 * 或者直接去user表刪除用戶也能夠
 * delete from user where user = 'myuser';
 * 
 * 查看錶結果
 * DESCRIBE user;或者 show create table shopnc_orders;
 * 
 * 
 * 查看一張表的索引
 *  show index from shopnc_orders;
 * 
 * 查看系統的變量
 * show variables;
 * 
 * 查看每一個表的信息
 * show table status;
 * 
 * 查看mysql的狀態信息
 * show status;
 * 
 * 查看顯示服務器所支持的不一樣權限
 * show privileges;
 * 
 * 查看建立數據庫的信息
 * show create database shopnc;
 * 
 * 查看mysql支持那些數據庫引擎
 * show engines;
 * 
 * 查看innodb的狀態
 * show innodb status;//有些有版本問題,沒法顯示
 * 
 * 
 * 給表增長一個字段
 * ALTER TABLE  `shopnc_address` ADD  `ss` VARCHAR( 24 ) NOT NULL AFTER  `dlyp_id`
 * 
 * 
 * 
 * 
 * 從本文件導入數據庫
 * 
 * windows和linux路徑的斜槓是不同的,請注意若是用Windows中的編輯器(使用\r\n作爲行的結束符)建立文件,應使用:
 * LOAD DATA LOCAL INFILE '/path/pet.txt' INTO TABLE pet
 * LINES TERMINATED BY '\r\n';
 * 在運行OS X的Apple機上,應使用行結束符'\r'。
 * 由於不一樣系統和文件格式的須要不同,請更具詳細文檔在使用
 * 
 * 
 * 匹配模式,
 * 匹配p大頭的數據
 *SELECT * FROM zx WHERE name LIKE 'p%'; 
 * 
 * 匹配p結尾的數據
 * SELECT * FROM zx WHERE name LIKE '%p'; 
 * 
 * 匹配含有p的數據
 * SELECT * FROM zx WHERE name LIKE '%p%'; 
 * 
 * 
 * 匹配長度爲3的數據
 * SELECT * FROM zx WHERE name LIKE '___';
 * 
 * mysql還能夠使用正則表達式函數
 * 用REGEXP和NOT REGEXP操做符(或RLIKE和NOT RLIKE,它們是同義詞)。
 * 
 * SELECT * FROM pet WHERE name REGEXP BINARY '^b'; 匹配以b大頭的name
 * 
 * SELECT * FROM pet WHERE name REGEXP 'fy$';匹配以fy結尾的name
 * 
 * 
 * 選擇最大的article數值,別名爲article字段名,表別名也是同樣
 * SELECT MAX(article) AS article FROM shop;
 * 
 * 
 * concat函數
 * 返回結果爲鏈接參數產生的字符串。若有任何一個參數爲NULL ,則返回值爲 NULL
 * 
 * mysql> select concat('11','22','33');
+------------------------+
| concat('11','22','33') |
+------------------------+
| 112233                 |
+------------------------+
 * 
mysql> select concat('11','22',NULL);
+------------------------+
| concat('11','22',NULL) |
+------------------------+
| NULL                   |
+------------------------+
 * 
 * 
 * 
mysqld是MySQL服務器
mysqld_safe、mysql.server和mysqld_multi是服務器啓動腳本
mysql_install_db初始化數據目錄和初始數據庫
 * 
mysql是一個命令行客戶程序,用於交互式或以批處理模式執行SQL語句。
o mysqladmin是用於管理功能的客戶程序。
o mysqlcheck執行表維護操做。
o mysqldump和mysqlhotcopy負責數據庫備份。
o mysqlimport導入數據文件。
o mysqlshow顯示信息數據庫和表的相關信息。
 * 
myisamchk執行表維護操做。
o myisampack產生壓縮、只讀的表。
o mysqlbinlog是處理二進制日誌文件的實用工具。
o perror顯示錯誤代碼的含義。
 * 
 * 一些命令的使用
shell> mysql test
shell> mysqladmin extended-status variables
shell> mysqlshow --help
shell> mysqldump --user=root personnel
 * 
 * 
 * 
 * 對於帶選項值的長選項,經過一個‘=’將選項名和值隔離開來。對於帶選項值的短選項,選項值能夠緊隨選項字母后面,或者兩者之間能夠用一個空格隔開。(-hlocalhost和-h localhost是等效的)。該規則的
例外狀況是指定MySQL密碼的選項。該選項的形式能夠爲--password=pass_val或--password。在後一種狀況(未給出密碼值),程序將提示輸入密碼。也能夠給出密碼選項,短形式爲-ppass_val或-p。然而,對於
短形式,若是給出了密碼值,必須緊跟在選項後面,中間不能插入空格。這樣要求的緣由是若是選項後面有空格,程序沒有辦法來告知後面的參量是密碼值仍是其它某種參量。所以,下面兩個命令的含義徹底不
同:
· shell> mysql -ptest
· shell> mysql -p test

第一個命令讓mysql使用密碼test,但沒有指定默認數據庫。第二個命令讓mysql提示輸入密碼並使用test做爲默認數據庫。
 * 
 * 
 * 
 * 
 * 
部分選項控制能夠開關的行爲。例如,mysql客戶端支持--column-names選項,肯定是否在查詢結果開頭顯示一行欄目名。默認狀況,該選項被啓用。可是可能在某些狀況下你想要禁用它,例如將mysql的輸出
發送到另外一個只但願看到數據而不但願看到開始的標題行的程序中。
要想禁用列名,能夠使用下面的形式來指定選項:
--disable-column-names
--skip-column-names
--column-names=0
--disable和--skip前綴與=0後綴的效果相同:它們均關閉選項。
能夠用下述方法「啓用」選項:
--column-names
--enable-column-names
--column-names=1
 * 
 * 
 * 
 * 
 * 
對mysql偶爾有用的另外一個選項是-e或--execute選項,可用來將SQL語句傳遞給服務器。該語句必須用引號引發來(單引號或雙引號)。(然而,若是想要在查詢中將值引發來,則對於查詢應使用雙引號,查詢中引
用的值應使用單引號)。當使用該選項時,語句被執行,而後mysql當即退出命令外殼。
例如,你能夠用下面的命令得到用戶帳戶列表:
shell> mysql -u root -p -e "SELECT User, Host FROM User" mysql
Enter password: ******
+------+-----------+
| User | Host |
+------+-----------+
| | gigan |
| root | gigan |
| | localhost |
| jon | localhost |
| root | localhost |
+------+-----------+
後面的mysql是數據庫名字
 * 
 * 
 * 查看系統變量
 *  show variables like '%log%';
 * 查看全部系統變量
 * show variables
 * 
 查看是否支持分區
mysql> show variables like '%partition%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| have_partitioning | YES   |
+-------------------+-------+
 * 查看支持的插件
mysql> show plugins;
+-----------------------+----------+--------------------+---------+---------+
| Name                  | Status   | Type               | Library | License |
+-----------------------+----------+--------------------+---------+---------+
| binlog                | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| mysql_native_password | ACTIVE   | AUTHENTICATION     | NULL    | GPL     |
| mysql_old_password    | ACTIVE   | AUTHENTICATION     | NULL    | GPL     |
| CSV                   | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| MEMORY                | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| MyISAM                | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| MRG_MYISAM            | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| ARCHIVE               | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| BLACKHOLE             | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| FEDERATED             | DISABLED | STORAGE ENGINE     | NULL    | GPL     |
| InnoDB                | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| INNODB_TRX            | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_LOCKS          | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_LOCK_WAITS     | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_CMP            | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_CMP_RESET      | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_CMPMEM         | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_CMPMEM_RESET   | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| PERFORMANCE_SCHEMA    | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| partition             | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
+-----------------------+----------+--------------------+---------+---------+
 * 
 * 
 * 
 * 

mysqld
SQL後臺程序(即MySQL服務器)。要想使用客戶端程序,該程序必須運行,由於客戶端經過鏈接服務器來訪問數據庫。參見5.3節,「mysqld:MySQL服務
器」。
· mysqld-max
包括更多特性的一個服務器版本。參見5.1.2節,「mysqld-max擴展MySQL服務器」
· mysqld_safe
服務器啓動腳本。若是mysqld-max存在,mysqld_safe試圖啓動它,不然啓動mysqld。參見5.1.3節,「mysqld_safe:MySQL服務器啓動腳本」。
· mysql.server
服務器啓動腳本。該腳本用於使用包含爲特定級別的運行啓動服務的腳本的運行目錄的系統。它調用mysqld_safe來啓動MySQL服務器。參
見5.1.4節,「mysql.server:MySQL服務器啓動腳本」。
· mysqld_multi
服務器啓動腳本,能夠啓動或中止系統上安裝的多個服務器。參見5.1.5節,「mysqld_multi:管理多個MySQL服務器的程序」
· mysql_install_db
該腳本用默認權限建立MySQL受權表。一般只是在系統上首次安裝MySQL時執行一次。參見2.9.2節,「Unix下安裝後的過程」。
· mysql_fix_ privilege_tables
在升級安裝後,若是新版本MySQL中的受權表有更改,則使用該腳原本更改受權表。參見2.10.2節,「升級受權表」。
服務器主機上還運行其它幾個程序:
Chapter 5. Database Administration
file:///D:/download/refman-5.1-zh.html-chapter/refman-5.1-zh.html-chapter/database-administration.html[2010/2/24 5:21:46]
· myisamchk
用來描述、檢查、優化和維護MyISAM表的實用工具。在5.9.5節,「myisamchk:MyISAM表維護實用工具」中描述了myisamchk。
· make_binary_distribution
該程序能夠生成編譯過的MySQL的二進制版本。能夠經過FTP上傳到ftp.mysql.com的/pub/mysql/upload/,供其它MySQL用戶使用。
· mysqlbug
MySQL 缺陷報告腳本。它能夠用來向MySQL郵件系統發送缺陷報告。(你也能夠訪問http://bugs.mysql.com/在線建立缺陷報告文件。參見1.7.1.3節,「如何
通報缺陷和問題」)。



要想找出你的服務器支持哪一個存儲引擎,執行下面的語句:
mysql> SHOW ENGINES;







shell> cd mysql_installation_directory
shell> bin/mysqld_safe &
若是mysqld_safe失敗,即便從MySQL安裝目錄調用仍然失敗,你能夠指定--ledir和--datadir選項來指示服務器和數據庫在你的系統中的安裝目錄。
通常狀況,你不該編輯mysqld_safe腳本。相反,應使用命令行選項或my.cnf選項文件的[mysqld_safe]部分的選項來配置mysqld_safe。通常不須要編
輯mysqld_safe來正確啓動服務器。可是,若是你編輯,未來升級MySQL後會覆蓋你修改的mysqld_safe版本,所以你應對你修改的版本進行備份以便將
來重裝。






mysqld_multi能夠管理多個幀聽不一樣Unix套接字文件和TCP/IP端口的鏈接的mysqld 進程。它能夠啓動或中止服務器,或報告它們的當前狀態。
程序尋找my.cnf中的[mysqldN]組(或--config-file選項指定的文件)。N 能夠爲任何正整數。在下面的討論中該數字指選項組號,或GNR。組號區別各選項組,
並用做mysqld_multi的參數來指定想要啓動、中止哪一個服務器或獲取哪一個服務器的狀態報告。這些組中的選項與將用來啓動mysqld的[mysqld]組中的相
同。(例如,參見2.9.2.2節,「自動啓動和中止MySQL」)。可是,當使用多個服務器時,須要每一個服務器使用本身的選項值,例如Unix套接字文件和TCP/IP端
口號。關於在多服務器環境中,每一個服務器對應惟一選項的詳細信息,參見5.12節,「在同一臺機器上運行多個MySQL服務器」。
要想調用mysqld_multi,使用下面的語法:
shell> mysqld_multi [options] {start|stop|report} [GNR[,GNR] ...]
start、stop和report表示你想要執行的操做。你能夠在單個服務器或多個服務器上執行指定的操做,取決於選項名後面的GNR 列。若是沒有該
列,mysqld_multi爲選項文件中的全部服務器執行該操做。
每一個GNR值表明一個選項組號或組號範圍。GNR值應爲選項文件中組名末尾的號。例如,組[mysqld17]的GNR爲17。要想指定組號的範圍,用破折號間隔開
第1個和最後1個號。GNR值10-13表明組[mysqld10]到[mysqld13]。能夠在命令行中指定多個組或組範圍,用逗號間隔開。GNR列不能有空格字符(空格
或tab);空格字符後面的內容將被忽略掉。
該命令使用選項組[mysqld17]啓動單個服務器:
shell> mysqld_multi start 17
該命令中止多個服務器,使用選項組[mysql8]和[mysqld10]至[mysqld13]:
shell> mysqld_multi stop 8,10-13
使用該命令列出設置選項文件的示例:
shell> mysqld_multi --example
mysqld_multi支持下面的選項:
· --config-file=name
指定選項文件名。這關係到mysqld_multi從哪裏尋找[mysqldN]選項組。沒有該選項,從通用my.cnf文件讀全部選項。選項不影響mysqld_multi從哪裏讀
取本身的選項,老是從通用my.cnf文件的[mysqld_multi]組讀取。
· --example
顯示示例選項文件。
· --help
顯示幫助消息並退出。
· --log=name
指定日誌文件名。若是該文件存在,後面爲日誌輸出。
Chapter 5. Database Administration
file:///D:/download/refman-5.1-zh.html-chapter/refman-5.1-zh.html-chapter/database-administration.html[2010/2/24 5:21:46]
· --mysqladmin=prog_name
用來中止服務器的mysqladmin二進制。
· --mysqld=prog_name
可用的mysqld二進制。請注意你還能夠將該選項的值指定爲mysqld_safe。選項被傳遞給mysqld。確保在PATH環境變量設定值或mysqld_safe中
有mysqld所在目錄。
· --no-log
按照標準輸出打印日誌信息,不要寫入日誌文件。默認狀況下,輸出寫入日誌文件。
· --password=password
調用mysqladmin時使用的MySQL帳戶的密碼。請注意該密碼值不是可選項,不象其它MySQL程序。
· --silent
禁用警告。
· --tcp-ip
經過TCP/IP端口而不是Unix套接字文件來鏈接每一個MySQL服務器。(若是找不到套接字文件, 服務器仍然能夠運行,但只能經過 TCP/IP端口訪問)。默認情
況下,使用Unix套接字文件進行鏈接。該選項影響stop和report操做。
· --user=user_name
調用mysqladmin時使用的MySQL帳戶的用戶名。
· --verbose
更詳細。
· --version
顯示版本信息並退出。
關於mysqld_multi的一些註解:
· 確保中止mysqld服務器(用mysqladmin程序)的MySQL帳戶在各個服務器中的用戶名和密碼相同。而且應確保帳戶具備SHUTDOWN權限。若是你想
要管理的服務器的管理帳戶有許多不一樣的用戶名或密碼,你須要在每一個服務器上建立一個帳戶,並具備相同的用戶名和密碼。例如,你能夠執行下面的命令
爲每一個服務器設置一個普通multi_admin帳戶:
· shell> mysql -u root -S /tmp/mysql.sock -proot_password
· mysql> GRANT SHUTDOWN ON *.*
· -> TO 'multi_admin'@'localhost' IDENTIFIED BY 'multipass';
參見5.7.2節,「權限系統工做原理」。你必須爲每一個mysqld服務器執行該操做。當鏈接時適當更改鏈接參數。請注意帳戶名的主機部分必須容許你
用multi_admin從你想要運行mysqld_multi的主機進行鏈接。
· 若是你使用mysqld_safe來啓動mysqld(例如,--mysqld=mysqld_safe),--pid-file選項很重要。每一個mysqld應有本身的進程ID文件。使
用mysqld_safe而不使用mysqld的好處是mysqld_safe「守護」其mysqld進程,若是用kill –9發送的信號或因爲其它緣由(例如分段故障)進程終止,則重
啓進程。請注意mysqld_safe腳本須要你從某個位置啓動它。這說明運行mysqld_multi前你必須進入某個目錄。若是啓動時有問題,請參
見mysqld_safe腳本。特別是要檢查下列行:
· ----------------------------------------------------------------
· MY_PWD=`pwd`
· # Check if we are starting this relative (for the binary release)
· if test -d $MY_PWD/data/mysql -a -f ./share/mysql/english/errmsg.sys -a \
· -x ./bin/mysqld
· ----------------------------------------------------------------
參見5.1.3節,「mysqld_safe:MySQL服務器啓動腳本」。上述行執行的測試應成功,不然你可能遇到了問題。
· 每一個mysqld的Unix套接字文件和TCP/IP端口號必須不一樣。
· 你可能想要爲mysqld使用--user選項,但爲此你須要用Unix root用戶運行mysqld_multi腳本。選項文件中有選項沒關係;若是你不是超級用戶,並
且你用本身的Unix帳戶重啓mysqld進程,你只會獲得警告。
· 重要:確保mysqld進程啓動所用Unix帳戶能夠徹底訪問數據目錄。不要使用Unix root帳戶,除非你知道你在作什麼。
· 很是重要:使用mysqld_multi前,確保理解傳遞給mysqld服務器的選項的含義以及你爲何想要獨立的mysqld進程。應清楚在相同的數據目錄下
使用多個mysqld服務器的危險。使用單獨的數據目錄,除非你知道你在作什麼。在線程系統中,在相同的數據目錄下啓動多個服務器不會獲得超性能。參
見5.12節,「在同一臺機器上運行多個MySQL服務器」。
下面的示例顯示了你如何設置選項文件來使用mysqld_multi。專門省去第1個和第5個[mysqldN]組來講明你的選項文件能夠稍有不一樣。這樣給你更大的靈活
Chapter 5. Database Administration
file:///D:/download/refman-5.1-zh.html-chapter/refman-5.1-zh.html-chapter/database-administration.html[2010/2/24 5:21:46]
性。mysqld程序重啓或中止的順序由它們在選項文件中的順序決定。
# This file should probably be in your home dir (~/.my.cnf)
# or /etc/my.cnf
# Version 2.1 by Jani Tolonen
[mysqld_multi]
mysqld = /usr/local/bin/mysqld_safe
mysqladmin = /usr/local/bin/mysqladmin
user = multi_admin
password = multipass
[mysqld2]
socket = /tmp/mysql.sock2
port = 3307
pid-file = /usr/local/mysql/var2/hostname.pid2
datadir = /usr/local/mysql/var2
language = /usr/local/share/mysql/english
user = john
[mysqld3]
socket = /tmp/mysql.sock3
port = 3308
pid-file = /usr/local/mysql/var3/hostname.pid3
datadir = /usr/local/mysql/var3
language = /usr/local/share/mysql/swedish
user = monty
[mysqld4]
socket = /tmp/mysql.sock4
port = 3309
pid-file = /usr/local/mysql/var4/hostname.pid4
datadir = /usr/local/mysql/var4
language = /usr/local/share/mysql/estonia
user = tonu
[mysqld6]
socket = /tmp/mysql.sock6
port = 3311
pid-file = /usr/local/mysql/var6/hostname.pid6
datadir = /usr/local/mysql/var6
language = /usr/local/share/mysql/japanese
user = jani





START INSTANCE mysqld4;啓動一個MySQL實例 配置在my.cnf裏面的[mysqld4]段裏配置

顯示全部載入的實例名:
mysql> show instances;


顯示選定的實例的狀態和版本信息:
SHOW INSTANCE STATUS mysqld3;




顯示實例使用的選項:
mysql> SHOW INSTANCE OPTIONS mysqld3;、


該命令提供實例使用的全部日誌文件
SHOW mysqld LOG FILES;


查看全部的日誌文件所在位置 很方便
SHOW VARIABLES LIKE  '%log%'
以上全部的命令均可以在phpmyadmin上運行,這樣看起來就更方便,控制檯的顯示方式不太友好

Variable_name    Value
back_log    50
binlog_cache_size    32768
binlog_direct_non_transactional_updates    OFF
binlog_format    MIXED
binlog_stmt_cache_size    32768
expire_logs_days    0
general_log    OFF
general_log_file    c:\wamp\bin\mysql\mysql5.5.20\data\USER-20141003JG...
innodb_flush_log_at_trx_commit    1
innodb_locks_unsafe_for_binlog    OFF
innodb_log_buffer_size    8388608
innodb_log_file_size    5242880
innodb_log_files_in_group    2
innodb_log_group_home_dir    .\
innodb_mirrored_log_groups    1
log    OFF
log_bin    ON
log_bin_trust_function_creators    OFF
log_error    c:\wamp\logs\mysql.log
log_output    FILE
log_queries_not_using_indexes    OFF
log_slave_updates    OFF
log_slow_queries    OFF
log_warnings    1
max_binlog_cache_size    18446744073709547520
max_binlog_size    1073741824
max_binlog_stmt_cache_size    18446744073709547520
max_relay_log_size    0
relay_log    
relay_log_index    
relay_log_info_file    relay-log.info
relay_log_purge    ON
relay_log_recovery    OFF
relay_log_space_limit    0
slow_query_log    OFF
slow_query_log_file    c:\wamp\bin\mysql\mysql5.5.20\data\USER-20141003JG...
sql_log_bin    ON
sql_log_off    OFF
sync_binlog    0
sync_relay_log    0
sync_relay_log_info    0


SHOW mysqld LOG FILES;這個語句也能夠查看日誌文件地址,多是版本緣由有些狀況下不能查看


+-------------+------------------------------------+----------+
| Logfile | Path | Filesize |
+-------------+------------------------------------+----------+
| ERROR LOG | /home/cps/var/mysql/owlet.err | 9186 |
| GENERAL LOG | /home/cps/var/mysql/owlet.log | 471503 |
| SLOW LOG | /home/cps/var/mysql/owlet-slow.log | 4463 |
+-------------+------------------------------------+----------+
 * 
 * 
 * 
 * 
 *
 * 
 * MySQL服務器能夠以不一樣的SQL模式來操做,而且能夠爲不一樣客戶端應用不一樣模式。這樣每一個應用程序能夠根據本身的需求來定製服務器的操做模式。
模式定義MySQL應支持哪些SQL語法,以及應執行哪一種數據驗證檢查。這樣能夠更容易地在不一樣的環境中使用MySQL,並結合其它數據庫服務器使
用MySQL。
你能夠用--sql-mode="modes"選項啓動mysqld來設置默認SQL模式。若是你想要重設,該值還能夠爲空(--sql-mode ="")。
你還能夠在啓動後用SET [SESSION|GLOBAL] sql_mode='modes'語句設置sql_mode變量來更改SQL模式。設置GLOBAL變量時須要擁有SUPER權限,而且會
影響從那時起鏈接的全部客戶端的操做。設置SESSION變量隻影響當前的客戶端。任何客戶端能夠隨時更改本身的會話sql_mode值。
Modesis是用逗號(‘,’)間隔開的一系列不一樣的模式。你能夠用SELECT @@sql_mode語句查詢當前的模式。默認值是空(沒有設置任何模式)。
主要重要sql_mode值爲:
· ANSI
更改語法和行爲,使其更符合標準SQL。
· STRICT_TRANS_TABLES
若是不能將給定的值插入到事務表中,則放棄該語句。對於非事務表,若是值出如今單行語句或多行語句的第1行,則放棄該語句。本節後面給出了更詳細的
描述。
· TRADITIONAL
Make MySQL的行爲象「傳統」SQL數據庫系統。該模式的簡單描述是當在列中插入不正確的值時「給出錯誤而不是警告」。註釋:一旦發現錯誤當即放
棄INSERT/UPDATE。若是你使用非事務存儲引擎,這種方式不是你想要的,由於出現錯誤前進行的數據更改不會「滾動」,結果是更新「只進行了一部分」。
本手冊指「嚴格模式」,表示至少STRICT _TRANS_TABLES或STRICT _ALL_TABLES被啓用的模式。
下面描述了支持的全部模式:
· ALLOW_INVALID_DATES
在嚴格模式下不要檢查所有日期。只檢查1到12之間的月份和1到31之間的日。這在Web應用程序中,當你從三個不一樣的字段獲取年、月、日,而且想要確切
保存用戶插入的內容(不進行日期驗證)時很重要。該模式適用於DATE和DATETIME列。不適合TIMESTAMP列,TIMESTAMP列須要驗證日期。
啓用嚴格模式後,服務器須要合法的月和日,不只僅是分別在1到12和1到31範圍內。例如,禁用嚴格模式時'2004-04-31'是合法的,但啓用嚴格模式後是非
法的。要想在嚴格模式容許遮掩固定日期,還應啓用ALLOW_INVALID_DATES。
· ANSI_QUOTES
將‘"’視爲識別符引號(‘`’引號字符),不要視爲字符串的引號字符。在ANSI模式,你能夠仍然使用‘`’來引用識別符。啓用ANSI_QUOTES後,你不能用雙引號來
引用字符串,由於它被解釋爲識別符。
· ERROR_FOR_DIVISION_BY_ZERO
在嚴格模式,在INSERT或UPDATE過程當中,若是被零除(或MOD(X,0)),則產生錯誤(不然爲警告)。若是未給出該模式,被零除時MySQL返回NULL。若是用
到INSERT IGNORE或UPDATE IGNORE中,MySQL生成被零除警告,但操做結果爲NULL。
· HIGH_NOT_PRECEDENCE
NOT操做符的優先順序是表達式例如NOT a BETWEEN b AND c被解釋爲NOT (a BETWEEN b AND c)。在一些舊版本MySQL中, 表達式被解釋爲(NOT a)
BETWEEN b AND c。啓用HIGH_NOT_PRECEDENCESQL模式,能夠得到之前的更高優先級的結果
 * 
 * 
 * 
 * 
 * 
 * 設置mysql的啓動模式
mysql> SET sql_mode = '';
mysql> SELECT NOT 1 BETWEEN -5 AND 5;
-> 0
mysql> SET sql_mode = 'broken_not';
mysql> SELECT NOT 1 BETWEEN -5 AND 5;
-> 1
 * 
 * 
 * 
 * 
 * 
 * mysqld服務器維護兩種變量。全局變量影響服務器的全局操做。會話變量影響具體客戶端鏈接相關操做。
服務器啓動時,將全部全局變量初始化爲默認值。能夠在選項文件或命令行中指定的選項來更改這些默認值。服務器啓動後,經過鏈接服務器並執行SET
GLOBAL var_name語句能夠更改動態全局變量。要想更改全局變量,必須具備SUPER權限。
服務器還爲每一個客戶端鏈接維護會話變量。鏈接時使用相應全局變量的當前值對客戶端會話變量進行初始化。客戶能夠經過SET SESSION var_name語句來
更改動態會話變量。設置會話變量不須要特殊權限,但客戶能夠只更改本身的會話變量,而不更改其它客戶的會話變量。
任何訪問全局變量的客戶端均可以看見對全局變量的更改。可是,它隻影響在更改後鏈接的從該全局變量初始化相應會話變量的客戶端。它不會影響已經連
接上的客戶端的會話變量(甚至是執行SET GLOBAL語句的客戶端)。
當使用啓動選項設置變量時,變量值能夠使用後綴K、M或G分別表示千字節、兆字節或gigabytes。例如,下面的命令啓動服務器時的鍵值緩衝區大小爲16
megabytes:
mysqld --key_buffer_size=16M
後綴的大小寫美關係;16M和16m是一樣的。
運行時,使用SET語句來設置系統變量。此時,不能使用後綴,但值能夠採起下列表達式:
mysql> SET sort_buffer_size = 10 * 1024 * 1024;
要想顯式指定是否設置全局或會話變量,使用GLOBAL或SESSION選項:
mysql> SET GLOBAL sort_buffer_size = 10 * 1024 * 1024;
mysql> SET SESSION sort_buffer_size = 10 * 1024 * 1024;
 * 
 * 
 * 
 * 
 * 
 * 
mysql_fix_privilege_tables:升級MySQL系統表
 * 一些MySQL發佈對mysql數據庫中的系統表的結構進行了更改,添加了新權限或特性。當你更新到新版本MySQL,你應同時更新系統表,以確保它們的結構最
新。首先備份mysql數據庫,而後按照下面的程序操做。
在Unix或Unix類系統中,運行mysql_fix_privilege_tables腳原本更新系統表:
shell> mysql_fix_privilege_tables
你必須在服務器運行時執行該腳本。它試圖鏈接本機上用root運行的服務器。若是root帳戶須要密碼,在命令行中按下述方法給出密碼:
shell> mysql_fix_privilege_tables--password=root_password
mysql_fix_privilege_tables腳本能夠執行將系統錶轉換爲當前格式的任何動做。運行時你可能會看見一些Duplicate column name警告;你能夠忽略它
們。
運行完腳本後,中止服務器並重啓。
在Windows系統中,MySQL分發包括mysql_fix_privilege_tables.sql SQL腳本,你能夠用mysql客戶端來運行。例如,若是MySQL安裝到C:\Program
Files\MySQL\MySQL Server 5.1,命令應爲:
C:\> C:\Program Files\MySQL\MySQL Server 5.1\bin\mysql -u root -p mysql
mysql> SOURCE C:/Program Files/MySQL/MySQL Server 5.1/scripts/mysql_fix_privilege_tables.sql
若是安裝到其它目錄,相應地更改路徑名。
mysql命令將提示輸入root密碼;按照提示輸入密碼。
在Unix中,當mysql處理mysql_fix_privilege_tables.sql script腳本中的語句時,你可能會看見一些Duplicate column name警告;你能夠忽略它們。
運行完腳本後,中止服務器並重啓。
 * 
 * 
 * 
 * 
 * 
 * 
 * 嘗試訪問mysql端口是否能夠聯通
 * telnet server_IP或者server_HOST 3306
 * 
 * 
 * 
 * 若是你從源碼構建MySQL但沒有使用--enable-local-infile選項來進行configure,則客戶不能使用LOAD DATA LOCAL,除非顯式調用mysql_options
(...MYSQL_OPT_本地_INFILE,0)
你能夠用--local-infile=0選項啓動mysqld從服務器端禁用全部LOAD DATA LOCAL命令。
· 對於mysql命令行客戶端,能夠經過指定--local-infile[=1]選項啓用LOAD DATA LOCAL,或經過--local-infile=0選項禁用。相似地,對
於mysqlimport,--local or -L選項啓用本地數據文件裝載。在任何狀況下,成功進行本地裝載須要服務器啓用相關選項。
· 若是你使用LOAD DATA LOCAL Perl腳本或其它讀選項文件中的[client]組的程序,你能夠在組內添加local-infile=1選項。可是,爲了便面不理解localinfile
的程序產生問題,則規定使用loose- prefix:
· [client]
· loose-local-infile=1
· 若是LOAD DATA LOCAL INFILE在服務器或客戶端被禁用,試圖執行該語句的客戶端將收到下面的錯誤消息:
ERROR 1148: The used command is not allowed with this MySQL version
 * 
 * 
 * MySQL提供的權限
。
權限             列          上下文
CREATE Create_priv 數據庫、表或索引
DROP Drop_priv 數據庫或表
GRANT OPTION Grant_priv 數據庫、表或保存的程序
REFERENCES References_priv 數據庫或表
ALTER Alter_priv 表
DELETE Delete_priv 表
INDEX Index_priv 表
INSERT Insert_priv 表
SELECT Select_priv 表
UPDATE Update_priv 表
CREATE VIEW Create_view_priv 視圖
SHOW VIEW Show_view_priv 視圖
ALTER ROUTINE Alter_routine_priv 保存的程序
CREATE ROUTINE Create_routine_priv 保存的程序
EXECUTE Execute_priv 保存的程序
FILE File_priv 服務器主機上的文件訪問
CREATE TEMPORARY TABLES Create_tmp_table_priv 服務器管理
LOCK TABLES Lock_tables_priv 服務器管理
CREATE USER Create_user_priv 服務器管理
PROCESS Process_priv 服務器管理
RELOAD Reload_priv 服務器管理
REPLICATION CLIENT Repl_client_priv 服務器管理
REPLICATION SLAVE Repl_slave_priv 服務器管理
SHOW DATABASES Show_db_priv 服務器管理
SHUTDOWN Shutdown_priv 服務器管理
SUPER Super_priv 服務器管理
 * 
 * 
 * 
 * 其他的權限用於管理性操做,它使用mysqladmin程序或SQL語句實施。下表顯示每一個管理性權限容許你執行的mysqladmin命令:
權限權限擁有者容許執行的命令
RELOAD flush-hosts, flush-logs, flush-privileges, flush-status, flush-tables, flush-threads, refresh, reload
SHUTDOWN shutdown
PROCESS processlist
SUPER kill
reload命令告訴服務器將受權表從新讀入內存。flush-privileges是reload的同義詞,refresh命令清空全部表並打開並關閉記錄文件,其它flush-xxx命令執行類
似refresh的功能,可是範圍更有限,而且在某些狀況下可能更好用。例如,若是你只是想清空記錄文件,flush-logs比refresh是更好的選擇。
shutdown命令關掉服務器。只能從mysqladmin發出命令。沒有相應的SQL語句。
processlist命令顯示在服務器內執行的線程的信息(即其它帳戶相關的客戶端執行的語句)。kill命令殺死服務器線程。你老是能顯示或殺死你本身的線程,
可是你須要PROCESS權限來顯示或殺死其餘用戶和SUPER權限啓動的線程。參見13.5.5.3節,「KILL語法」。
擁有CREATE TEMPORARY TABLES權限即可以使用CREATE TABLE語句中的關鍵字TEMPORARY。
擁有LOCK TABLES權限即可以直接使用LOCK TABLES語句來鎖定你擁有SELECT權限的表。包括使用寫鎖定,能夠防止他人讀鎖定的表。
擁有REPLICATION CLIENT權限即可以使用SHOW MASTER STATUS和SHOW SLAVE STATUS。
REPLICATION SLAVE權限應授予從服務器所使用的將當前服務器鏈接爲主服務器的帳戶。沒有這個權限,從服務器不能發出對主服務器上的數據庫所發出的
更新請求。
擁有SHOW DATABASES權限便容許帳戶使用SHOW DATABASE語句來查看數據庫名。沒有該權限的帳戶只能看到他們具備部分權限的數據庫, 若是數據庫
用--skip-show-database選項啓動,則根本不能使用這些語句。請注意全局權限指數據庫的權限。
總的說來,只授予權限給須要他們的那些用戶是好主意,可是你應該在授予FILE和管理權限時試驗特定的警告:
FILE權限能夠被濫用於將服務器主機上MySQL能讀取的任何文件讀入到數據庫表中。包括任何人可讀的文件和服務器數據目錄中的文件。能夠使
用SELECT訪問數據庫表,而後將其內容傳輸到客戶端上。
GRANT權限容許用戶將他們的權限給其餘用戶。有不一樣的權限並有GRANT權限的2個用戶能夠合併權限。
ALTER權限能夠用於經過從新命名錶來推翻權限系統。
SHUTDOWN權限經過終止服務器能夠被濫用徹底拒絕爲其餘用戶服務。
PROCESS權限能被用來察看當前執行的查詢的明文文本,包括設定或改變密碼的查詢。
SUPER權限能用來終止其它用戶或更改服務器的操做方式。
授給mysql數據庫自己的權限能用來改變密碼和其餘訪問權限信息。密碼被加密存儲,因此惡意的用戶不能簡單地讀取他們以知道明文密碼。然而,具
有user表Password列寫訪問權限的用戶能夠更改帳戶的密碼,並能夠用該帳戶鏈接MySQL服務器。
有一些事情你不能用MySQL權限系統作到:
你不能明顯地指定某個給定的用戶應該被拒絕訪問。即,你不能明顯地匹配用戶而後拒絕鏈接。
你不能指定用戶有權建立立或刪除數據庫中的表,但不能建立或刪除數據庫自己。
 * 
 * 
 * 
 * 
 * 
 * 
若是你鏈接時指定主機名,但獲得錯誤消息主機名未顯示或爲IP號,表示當MySQL服務器將IP號解析爲客戶端來名時遇到錯誤:
· shell> mysqladmin -u root -pxxxx -h some-hostname ver
· Access denied for user 'root'@'' (using password: YES)
這表示DNS問題。要想修復,執行mysqladmin flush-hosts來重設內部 DNS主機名緩存
 * 
 * 
 * 
 * 一些經常使用的解決方案包括:
o 試試找出DNS服務器的錯誤並修復。

o 在MySQL受權表中指定IP號而不是主機名。
o 在/etc/hosts中放入客戶端名。
o 用--skip-name-resolve選項啓動mysqld。
o 用--skip-host-cache選項啓動mysqld。
o 在Unix中,若是你在同一臺機器上運行服務器和客戶端,鏈接到localhost。鏈接到的localhost的Unix鏈接使用Unix套接字文件而不是TCP/IP。
o 在Windows中,你在同一臺機器上運行服務器和客戶端而且服務器支持命名管道鏈接,鏈接主機名(週期)。鏈接使用命名管道而不是TCP/IP。
若是mysql -u root test工做可是mysql -h your_hostname -u root test致使Access denied(your_hostname是本地機的實際主機名),那麼在user表中
可能沒有你的主機的正確名字。這裏的一個廣泛的問題是在user錶行中的Host值指定一個惟一的主機名,可是你係統的名字解析例程返回一個徹底正規
的域名(或相反)。例如,若是你在user表中有一個主機是'tcx'的行,可是你的DNS告訴MySQL你的主機名是'tcx.subnet.se',行將不工做。嘗試把一個
行加到user表中,它包含你主機的IP號做爲Host列的值。(另外,你能夠把一個行加到user表中,它有包含一個通配符如'tcx.%'的Host值。然而,使用
以「%」結尾的主機名是不安全的而且不推薦!)
若是mysql -u user_name test工做可是mysql -u user_name other_db_name不工做,你沒有爲給定的用戶授予other_db_name數據庫的訪問權限。
當在服務器上執行mysql -u user_name時,它工做,可是在其它遠程客戶端上執mysql -h host_name -u user_name時,它卻不工做,你沒有爲給定的
用戶授予從遠程主機訪問服務器的權限。
若是你不能弄明白你爲何獲得Access denied,從user表中刪除全部Host包含通配符值的行(包含「%」或「_」的條目)。一個很廣泛的錯誤是
用Host='%'和User='some_user'插入一個新行,認爲這將容許你指定localhost從同一臺機器進行鏈接。它不工做的緣由是默認權限包括一個
有Host='localhost'和User=''的行,由於那個行的Host值'localhost'比'%'更具體,當從localhost鏈接時,它用於指向新行!正確的步驟是插
入Host='localhost'和User='some_user'的第2個行,或刪除Host='localhost'和User=''行。刪除條目後,記住用FLUSH PRIVILEGES語句重載受權表。
· 若是你獲得下列錯誤,能夠與db或host表有關:
· Access to database denied
若是從db表中選擇了在Host列有空值的條目,保證在host表中有一個或多個相應的條目,指定db表中的條目適用哪些主機。
· 若是你可以鏈接MySQL服務器,但若是在使用命令SELECT ... INTO OUTFILE或LOAD DATA INFILE語句時,你獲得Access denied錯誤,在user表中的
條目可能沒有啓用FILE權限。
· 若是你直接更改受權表(例如,使用INSERT、UPDATE或DELETE語句)而且你的更改好像被忽略了,記住你必須執行FLUSH PRIVILEGES語句
或mysqladmin flush-privileges命令讓服務器來重讀受權表。不然,直到服務器下次重啓,你的更改方有效。記住用UPDATE命令更改root密碼後,在清
空權限前,你不須要指定新密碼,由於服務器還不知道你已經更改了密碼!
 * 
 * 
 * 
 * 
在MySQL 4.1以前,用PASSWORD()函數計算的密碼哈希值有16個字節長。應爲:
mysql> SELECT PASSWORD('mypass');
+--------------------+
| PASSWORD('mypass') |
+--------------------+
| 6f8c114b58f2ce9e |
+--------------------+
 * 
 * 
在MySQL 4.1中,已經對PASSWORD()函數進行了修改,能夠生成41字節的哈希值:
mysql> SELECT PASSWORD('mypass');
+-------------------------------------------+
| PASSWORD('mypass') |
+-------------------------------------------+
| *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
+-------------------------------------------+
 * 
 * 
 * 
 * 
限制MySQL服務器資源使用的一個方法是將max_user_connections系統變量設置爲非零值。可是,該方法嚴格限於全局,不容許管理具體帳戶。而且,它只
限制使用單一帳戶同時鏈接的數量,而不是客戶端鏈接後的操做。許多MySQL管理員對兩種類型的控制均感興趣,特別是Internet服務提供者。
在MySQL 5.1中,你能夠爲具體帳戶限制下面的服務器資源:
· 帳戶每小時能夠發出的查詢數
· 帳戶每小時能夠發出的更新數
· 帳戶每小時能夠鏈接服務器的次數
客戶端能夠執行的語句根據查詢限制來記數。只有修改數據庫或表的語句根據更新限制來記數。
還能夠限制每一個帳戶的同時鏈接服務器的鏈接數。
本文中的帳戶爲user表中的單個記錄。根據User和Host列值惟一識別每一個帳戶。
作爲使用該特性的先決條件,mysql數據庫的user表必須包含資源相關的列。資源限制保存
在max_questions、max_updates、max_connections和max_user_connections列內。若是user表沒有這些列,必須對它進行升級;參見2.10.2節,「升級受權
表」。
要想用GRANT語句設置資源限制,使WITH子句來命名每一個要限制的資源和根據每小時記數的限制值。例如,要想只以限制方式建立能夠訪問customer數據
庫的新帳戶,執行該語句:
mysql> GRANT ALL ON customer.* TO 'francis'@'localhost'
-> IDENTIFIED BY 'frank'
-> WITH MAX_QUERIES_PER_HOUR 20
-> MAX_UPDATES_PER_HOUR 10
-> MAX_CONNECTIONS_PER_HOUR 5
-> MAX_USER_CONNECTIONS 2;
限制類型不須要所有在WITH子句中命名,但已經命名的能夠按任何順序。每一個每小時限制值均應爲整數,表明每小時的記數。若是GRANT語句沒有WITH子
句,則每一個限制值設置爲默認值零(即沒有限制)。對於MAX_USER_CONNECTIONS,限制爲整數,表示帳戶一次能夠同時鏈接的最大鏈接數。若是限制設置
爲默認值零,則根據MAX_USER_CONNECTIONS系統變量肯定該帳戶能夠同時鏈接的數量。
要想設置或更改已有帳戶的限制,在全局級別使用GRANT USAGE語句(在*.*)。下面的語句能夠將francis的查詢限制更改成100:
mysql> GRANT USAGE ON *.* TO 'francis'@'localhost'
-> WITH MAX_QUERIES_PER_HOUR 100;
該語句沒有改變帳戶的已有權限,只修改了指定的限制值。
要想取消已有限制,將該值設置爲零。例如,要想取消francis每小時能夠鏈接的次數的限制,使用該語句:
mysql> GRANT USAGE ON *.* TO 'francis'@'localhost'
-> WITH MAX_CONNECTIONS_PER_HOUR 0;
當帳戶使用資源時若是有非零限制,則對資源使用進行記數。
服務器運行時,它統計每一個帳戶使用資源的次數。若是帳戶在最後一個小時的鏈接次數達到限制,該帳戶的進一步的鏈接被拒絕。相似地,若是帳戶達到查
詢或更新次數的限制,進一步的查詢或更新被拒絕。在這種狀況下,會給出相關錯誤消息。
根據每一個帳戶進行資源計算,而不是根據每一個客戶端。例如,若是你的帳戶的查詢限制爲50,你不能經過兩個客戶端同時鏈接服務器將限制增長到100。兩個
鏈接的查詢被計算到一塊兒。

能夠爲全部帳戶從全局重設當前的每小時資源使用記數,或單獨重設給定的帳戶:
· 要想將全部帳戶當前的記數重設爲零,能夠執行FLUSH USER_RESOURCES語句。還能夠經過重載受權表來重設記數(例如,使用FLUSH
PRIVILEGES語句或mysqladmin reload命令)。
· 將具體帳戶的限制從新授予任何值,能夠將它設置爲零。要想實現,按照前面所述使用GRANT USAGE,並將限制值指定爲該帳戶當前的限制值。
計數器重設不影響MAX_USER_CONNECTIONS限制。
當服務器啓動時全部記數從零開始。
 * 
 *
 * 
 * 
 * 
 MySQL能夠檢查X509證書的屬性和基於用戶名和密碼的通用鑑定方法。要想爲MySQL帳戶指定SSL相關選項,使用GRANT語句的REQUIRE子句。參
見13.5.1.3節,「GRANT和REVOKE語法」。
有多種可能來限制一個帳戶的鏈接類型:
· 若是帳戶沒有SSL或X509需求,若是用戶名和密碼合法,容許未加密的鏈接。可是,若是客戶有正確的證書和密鑰文件,在客戶選項中能夠使用加密
鏈接。
· REQUIRE SSL選項限制服務器只容許該帳戶的SSL加密鏈接。請注意若是有ACL記錄容許非SSL鏈接,該選項會被忽略。
· mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
· -> IDENTIFIED BY 'goodsecret' REQUIRE SSL;
· REQUIRE X509表示客戶必須有合法證書但確切的證書、分發者和主體不重要。惟一的需求是應能夠被某個CA認證機構驗證它的簽名。
· mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
· -> IDENTIFIED BY 'goodsecret' REQUIRE X509;
· REQUIRE ISSUER 'issuer'限制鏈接企圖,即客戶必須出示CA 'issuer'簽發的合法X509證書。若是客戶出示了一個合法證書,可是是由不一樣的分發者籤
發,服務器拒絕鏈接。使用X509證書表示要加密,所以不須要SSL選項。
· mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
· -> IDENTIFIED BY 'goodsecret'
· -> REQUIRE ISSUER '/C=FI/ST=Some-State/L=Helsinki/
· O=MySQL Finland AB/CN=Tonu Samuel/Email=tonu@example.com';
請注意ISSUER值應作爲單一字符串輸入。
· REQUIRE SUBJECT 'subject' 限制鏈接企圖,即客戶必須出示主題爲'subject'的合法X509證書。若是客戶出示了一個合法證書,可是有不一樣的主題,服
務器拒絕鏈接。
· mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
· -> IDENTIFIED BY 'goodsecret'

· -> REQUIRE SUBJECT '/C=EE/ST=Some-State/L=Tallinn/
· O=MySQL demo client certificate/
CN=Tonu Samuel/Email=tonu@example.com';
請注意SUBJECT值應作爲單一字符串輸入。
· REQUIRE CIPHER 'cipher'用來確保使用足夠強的密碼和密鑰長度。若是使用舊的短加密密鑰算法,SSL自己可能很弱。使用該選項,咱們能夠索取確
切的加密方法來鏈接。
· mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
· -> IDENTIFIED BY 'goodsecret'
-> REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA';
在REQUIRE子句中,能夠結合使用SUBJECT、ISSUER和CIPHER選項:
mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
-> IDENTIFIED BY 'goodsecret'
-> REQUIRE SUBJECT '/C=EE/ST=Some-State/L=Tallinn/
O=MySQL demo client certificate/
CN=Tonu Samuel/Email=tonu@example.com'
-> AND ISSUER '/C=FI/ST=Some-State/L=Helsinki/
O=MySQL Finland AB/CN=Tonu Samuel/Email=tonu@example.com'
-> AND CIPHER 'EDH-RSA-DES-CBC3-SHA';
請注意SUBJECT和ISSUER值應作爲單一字符串輸入。
在MySQL 5.1中,在REQUIRE選項之間能夠選用AND關鍵字。
選項的順序不重要,但任何選項不能用兩次。
 * 
 * 
 * 
 * 
備份數據庫的另外一個技術是使用mysqldump程序或mysqlhotcopy腳本。參見8.8節,「mysqldump:數據庫備份程序」和8.9節,「mysqlhotcopy:數據庫備
份程序」。
1. 徹底備份數據庫:
2. shell> mysqldump --tab=/path/to/some/dir --opt db_name
或:
shell> mysqlhotcopy db_name /path/to/some/dir
只要服務器再也不進行更新,還能夠只複製全部表文件(*.frm、*.MYD和*.MYI文件)。mysqlhotcopy腳本使用該方法。(但請注意若是數據庫包含InnoDB表,
這些方法不工做。InnoDB不將表的內容保存到數據庫目錄中,mysqlhotcopy只適合MyISAM表)。
3. 若是mysqld在運行則中止,而後用--log-bin[=file_name]選項來啓動。參見5.11.3節,「二進制日誌」。二進制日誌文件中提供了執行mysqldump以後
對數據庫的更改進行復制所須要的信息。
對於InnoDB表,能夠進行在線備份,不須要對錶進行鎖定;參見8.8節,「mysqldump:數據庫備份程序」。
MySQL支持增量備份:須要用--log-bin選項來啓動服務器以便啓用二進制日誌;參見5.11.3節,「二進制日誌」。當想要進行增量備份時(包含上一次徹底備份或
增量備份以後的全部更改),應使用FLUSH LOGS回滾二進制日誌。而後,你須要將從最後的徹底或增量備份的某個時刻到最後某個點的全部二進制日誌複製
到備份位置。這些二進制日誌爲增量備份;恢復時,按照下面的解釋應用。下次進行徹底備份時,還應使用FLUSH LOGS或mysqlhotcopy --flushlogs回滾二進
制日誌。參見8.8節,「mysqldump:數據庫備份程序」和8.9節,「mysqlhotcopy:數據庫備份程序」。
若是MySQL服務器爲從複製服務器,則不管選擇什麼備份方法,當備份從機數據時,還應備份master.info和relay-log.info文件。恢復了從機數據後,須要這
些文件來繼續複製。若是從機執行復制LOAD DATA INFILE命令,你應還備份用--slave-load-tmpdir選項指定的目錄中的SQL_LOAD-*文件。(若是未指定,該
位置默認爲tmpdir變量值)。從機須要這些文件來繼續複製中斷的LOAD DATA INFILE操做。
若是必須恢復MyISAM表,先使用REPAIR TABLE或myisamchk -r來恢復。99.9%的狀況下該方法能夠工做。若是myisamchk失敗,試試下面的方法。請注
意只有用--log-bin選項啓動了MySQL從而啓用二進制日誌它才工做;參見5.11.3節,「二進制日誌」。
1. 恢復原mysqldump備份,或二進制備份。
2. 執行下面的命令從新更新二進制日誌:
3. shell> mysqlbinlog hostname-bin.[0-9]* | mysql
在某些狀況下,你可能只想要從某個位置從新運行某些二進制日誌。(一般你想要從恢復備份的日期從新運行全部二進制日誌,查詢不正確時例外)。關

於mysqlbinlog工具和如何使用它的詳細信息參見8.6節,「mysqlbinlog:用於處理二進制日誌文件的實用工具」。
還能夠對具體文件進行選擇備份:
· 要想複製表,使用SELECT * INTO OUTFILE 'file_name' FROM tbl_name。
· 要想重載表,使用LOAD DATA INFILE 'file_name' REPLACE ...並恢復。要避免複製記錄,表必須有PRIMARY KEY或一個UNIQUE索引。當新記錄複製
惟一鍵值的舊記錄時,REPLACE關鍵字能夠將舊記錄替換爲新記錄。
若是備份時遇到服務器性能問題,能夠有幫助的一個策略是在從服務器而不是主服務器上創建複製並執行備份。參見6.1節,「複製介紹」。
若是使用Veritas文件系統,能夠這樣備份:
1. 從客戶端程序執行FLUSH TABLES WITH READ LOCK。
2. 從另外一個shell執行mount vxfs snapshot。
3. 從第一個客戶端執行UNLOCK TABLES。
4. 從快照複製文件。
5. 卸載快照。
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
shell> mysqldump --single-transaction --all-databases > backup_sunday_1_PM.sql
這是在線非塊備份,不會干擾對錶的讀寫。咱們之前假定咱們的表爲InnoDB表,所以--single-transaction使用一致性地讀,而且保證mysqldump所看見的數
據不會更改。(其它客戶端對InnoDB表進行的更改不會被mysqldump進程看見)。若是咱們還有其它類型的表,咱們必須假定在備份過程當中它們不會更改。
例如,對於mysql數據庫中的MyISAM表,咱們必須假定在備份過程當中沒有對MySQL帳戶進行管理更改。

--single-transaction
InnoDB 表在備份時,一般啓用選項 --single-transaction 來保證備份的一致性,實際上它的工做原理是設定本次會話的隔離級別爲:REPEATABLE READ,以確保本次會話(dump)時,不會看到其餘會話已經提交了的數據。
 * 
 * 
 * 
在星期一下午1點,咱們能夠清空日誌開始新的二進制日誌文件來建立增量備份。例如,執行mysqladmin flush-logs命令建立gbichot2-bin.000008。星期
日下午1點的徹底備份和星期一下午1點之間的全部更改成文件gbichot2-bin.000007。該增量備份很重要,所以最好將它複製到安全的地方。(例如,備份到磁
帶或DVD上,或複製到另外一臺機器上)。在星期二下午1點,執行另外一個mysqladmin flush-logs命令。星期一下午1點和星期二下午1點之間的全部全部更
改成文件gbichot2-bin.000008(也應複製到某個安全的地方)。
MySQL二進制日誌佔據硬盤空間。要想釋放空間,應隨時清空。操做方法是刪掉再也不使用的二進制日誌,例如進行徹底備份時:
shell> mysqldump --single-transaction --flush-logs --master-data=2
--all-databases --delete-master-logs > backup_sunday_1_PM.sql
註釋:若是你的服務器爲複製主服務器,用mysqldump --delete-master-logs刪掉MySQL二進制日誌很危險,由於從服務器可能尚未徹底處理該二進
制日誌的內容。
PURGE MASTER LOGS語句的描述中解釋了爲何在刪掉MySQL二進制日誌以前應進行確認
 * 
 * 
 * 
 * 
 * 
 * 
 * 
爲恢復進行備份
如今假設在星期三上午8點出現了災難性崩潰,須要使用備份文件進行恢復。恢復時,咱們首先恢復最後的徹底備份(從星期日下午1點開始)。徹底備份文件
是一系列SQL語句,所以恢復它很容易:
shell> mysql < backup_sunday_1_PM.sql

在該點,數據恢復到星期日下午1點的狀態。要想恢復從那時起的更改,咱們必須使用增量備份,也就是,gbichot2-bin.000007和gbichot2-bin.000008二進
制日誌文件。根據須要從備份處取過這些文件,而後按下述方式處理:
shell> mysqlbinlog gbichot2-bin.000007 gbichot2-bin.000008 | mysql
咱們如今將數據恢復到星期二下午1點的狀態,可是從該時刻到崩潰之間的數據仍然有丟失。要想恢復,咱們須要MySQL服務器將MySQL二進制日誌保存到安
全的位置(RAID disks, SAN, ...),應爲與數據文件的保存位置不一樣的地方,保證這些日誌不在毀壞的硬盤上。(也就是,咱們能夠用--log-bin選項啓動服務
器,指定一個其它物理設備上的與數據目錄不一樣的位置。這樣,即便包含該目錄的設備丟失,日誌也不會丟失)。若是咱們執行了這些操做,咱們手頭上會
有gbichot2-bin.000009文件,咱們能夠用它來恢復大部分最新的數據更改,而不會丟失到崩潰時的數據
 * 
 * 
 * 
 * 指定恢復時間
若是MySQL服務器啓用了二進制日誌,你能夠使用mysqlbinlog工具來恢復從指定的時間點開始 (例如,從你最後一次備份)直到如今或另外一個指定的時間點
的數據。關於啓用二進制日誌的信息,參見5.11.3節,「二進制日誌」。對於mysqlbinlog的詳細信息,參見8.6節,「mysqlbinlog:用於處理二進制日誌文件
的實用工具」。
要想從二進制日誌恢復數據,你須要知道當前二進制日誌文件的路徑和文件名。通常能夠從選項文件(即my.cnf or my.ini,取決於你的系統)中找到路徑。如
果未包含在選項文件中,當服務器啓動時,能夠在命令行中以選項的形式給出。啓用二進制日誌的選項爲--log-bin。要想肯定當前的二進制日誌文件的文件
名,輸入下面的MySQL語句:
SHOW BINLOG EVENTS \G
你還能夠從命令行輸入下面的內容:
mysql --user=root -pmy_pwd -e 'SHOW BINLOG EVENTS \G'
將密碼my_pwd替換爲服務器的root密碼。
 指定恢復時間
對於MySQL 4.1.4,能夠在mysqlbinlog語句中經過--start-date和--stop-date選項指定DATETIME格式的起止時間。舉例說明,假設在今天上午10:00(今天
是2005年4月20日),執行SQL語句來刪除一個大表。要想恢復表和數據,你能夠恢復前晚上的備份,並輸入:
mysqlbinlog --stop-date="2005-04-20 9:59:59" /var/log/mysql/bin.123456 \
| mysql -u root -pmypwd
該命令將恢復截止到在--stop-date選項中以DATETIME格式給出的日期和時間的全部數據。若是你沒有檢測到幾個小時後輸入的錯誤的SQL語句,可能你想要
恢復後面發生的活動。根據這些,你能夠用起使日期和時間再次運行mysqlbinlog:
mysqlbinlog --start-date="2005-04-20 10:01:00" /var/log/mysql/bin.123456 \
| mysql -u root -pmypwd \
在該行中,從上午10:01登陸的SQL語句將運行。組合執行前夜的轉儲文件和mysqlbinlog的兩行能夠將全部數據恢復到上午10:00前一秒鐘。你應檢查日誌
以確保時間確切。下一節介紹如何實現。
 * 
 * 
 * 
表維護和崩潰恢復
後面幾節討論如何使用myisamchk來檢查或維護MyISAM表(對應.MYI和.MYD文件的表)。
你能夠使用myisamchk實用程序來得到有關你的數據庫表的信息或檢查、修復、優化他們。下列小節描述如何調用myisamchk(包括它的選項的描述),
如何創建表的維護計劃,以及如何使用myisamchk執行各類功能。
儘管用myisamchk修復表很安全,在修復(或任何能夠大量更改表的維護操做)以前先進行備份也是很好的習慣
影響索引的myisamchk操做會使ULLTEXT索引用full-text參數重建,再也不與MySQL服務器使用的值兼容。要想避免,請閱讀5.9.5.1節,「用於myisamchk的一
般選項」的說明。
在許多狀況下,你會發現使用SQL語句實現MyISAM表的維護比執行myisamchk操做要容易地多:
· 要想檢查或維護MyISAM表,使用CHECK TABLE或REPAIR TABLE。
· 要想優化MyISAM表,使用OPTIMIZE TABLE。
· 要想分析MyISAM表,使用ANALYZE TABLE。
能夠直接這些語句,或使用mysqlcheck客戶端程序,能夠提供命令行接口。
這些語句比myisamchk有利的地方是服務器能夠作任何工做。使用myisamchk,你必須確保服務器在同一時間不使用表。不然,myisamchk和服務器之
間會出現不指望的相互干涉。
 * 
 * 
 * 
 * 
能夠使用myisamchk實用程序來得到有關數據庫表的信息或檢查、修復、優化他們。myisamchk適用MyISAM表(對應.MYI和.MYD文件的表)。
調用myisamchk的方法:
shell> myisamchk [options] tbl_name ...
options指定你想讓myisamchk作什麼。在後面描述它們。還能夠經過調用myisamchk --help獲得選項列表。
tbl_name是你想要檢查或修復的數據庫表。若是你不在數據庫目錄的某處運行myisamchk,你必須指定數據庫目錄的路徑,由於myisamchk不知道你的數
據庫位於哪兒。實際上,myisamchk不在意你正在操做的文件是否位於一個數據庫目錄;你能夠將對應於數據庫表的文件拷貝到別處而且在那裏執行恢復操
做。
若是你願意,能夠用myisamchk命令行命名幾個表。還能夠經過命名索引文件(用「 .MYI」後綴)來指定一個表。它容許你經過使用模式「*.MYI」指定在一個目
錄全部的表。例如,若是你在數據庫目錄,能夠這樣在目錄下檢查全部的MyISAM表:
shell> myisamchk *.MYI
若是你不在數據庫目錄下,可經過指定到目錄的路徑檢查全部在那裏的表:
shell> myisamchk /path/to/database_dir/*.MYI
你甚至能夠經過爲MySQL數據目錄的路徑指定一個通配符來檢查全部的數據庫中的全部表:
shell> myisamchk /path/to/datadir/*/*.MYI
推薦的快速檢查全部MyISAM表的方式是:
shell> myisamchk --silent --fast /path/to/datadir/*/*.MYI
若是你想要檢查全部MyISAM表並修復任何破壞的表,能夠使用下面的命令:
shell> myisamchk --silent --force --fast --update-state \
-O key_buffer=64M -O sort_buffer=64M \
-O read_buffer=1M -O write_buffer=1M \
/path/to/datadir/*/*.MYI
Chapter 5. Database Administration
file:///D:/download/refman-5.1-zh.html-chapter/refman-5.1-zh.html-chapter/database-administration.html[2010/2/24 5:21:46]
該命令假定你有大於64MB的自由內存。關於用myisamchk分配內存的詳細信息,參見5.9.5.5節,「myisamchk內存使用」。
當你運行myisamchk時,必須確保其它程序不使用表。不然,當你運行myisamchk時,會顯示下面的錯誤消息:
warning: clients are using or haven't closed the table properly
這說明你正嘗試檢查正被另外一個尚未關閉文件或已經終止而沒有正確地關閉文件的程序(例如mysqld服務器)更新的表。
若是mysqld正在運行,你必須經過FLUSH TABLES強制清空仍然在內存中的任何表修改。當你運行myisamchk時,必須確保其它程序不使用表。避免該問
題的最容易的方法是使用CHECK TABLE而不用myisamchk來檢查表
 * 
 * 
 * 
 * 
 * 
 * 
能夠使用myisamchk實用程序來得到有關數據庫表的信息或檢查、修復、優化他們。myisamchk適用MyISAM表(對應.MYI和.MYD文件的表)。
調用myisamchk的方法:
shell> myisamchk [options] tbl_name ...
options指定你想讓myisamchk作什麼。在後面描述它們。還能夠經過調用myisamchk --help獲得選項列表。
tbl_name是你想要檢查或修復的數據庫表。若是你不在數據庫目錄的某處運行myisamchk,你必須指定數據庫目錄的路徑,由於myisamchk不知道你的數
據庫位於哪兒。實際上,myisamchk不在意你正在操做的文件是否位於一個數據庫目錄;你能夠將對應於數據庫表的文件拷貝到別處而且在那裏執行恢復操
做。
若是你願意,能夠用myisamchk命令行命名幾個表。還能夠經過命名索引文件(用「 .MYI」後綴)來指定一個表。它容許你經過使用模式「*.MYI」指定在一個目
錄全部的表。例如,若是你在數據庫目錄,能夠這樣在目錄下檢查全部的MyISAM表:
shell> myisamchk *.MYI
若是你不在數據庫目錄下,可經過指定到目錄的路徑檢查全部在那裏的表:
shell> myisamchk /path/to/database_dir/*.MYI
你甚至能夠經過爲MySQL數據目錄的路徑指定一個通配符來檢查全部的數據庫中的全部表:
shell> myisamchk /path/to/datadir/*/*.MYI
推薦的快速檢查全部MyISAM表的方式是:
shell> myisamchk --silent --fast /path/to/datadir/*/*.MYI
若是你想要檢查全部MyISAM表並修復任何破壞的表,能夠使用下面的命令:
shell> myisamchk --silent --force --fast --update-state \
-O key_buffer=64M -O sort_buffer=64M \
-O read_buffer=1M -O write_buffer=1M \
/path/to/datadir/*/*.MYI

該命令假定你有大於64MB的自由內存。關於用myisamchk分配內存的詳細信息,參見5.9.5.5節,「myisamchk內存使用」。
當你運行myisamchk時,必須確保其它程序不使用表。不然,當你運行myisamchk時,會顯示下面的錯誤消息:
warning: clients are using or haven't closed the table properly
這說明你正嘗試檢查正被另外一個尚未關閉文件或已經終止而沒有正確地關閉文件的程序(例如mysqld服務器)更新的表。
若是mysqld正在運行,你必須經過FLUSH TABLES強制清空仍然在內存中的任何表修改。當你運行myisamchk時,必須確保其它程序不使用表。避免該問
題的最容易的方法是使用CHECK TABLE而不用myisamchk來檢查表
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
服務器時區支持
MySQL服務器有幾個時區設置:
· 系統時區。服務器啓動時便試圖肯定主機的時區,用它來設置system_time_zone系統變量。
· 服務器當前的時區。全局系統變量time_zone表示服務器當前使用的時區。初使值爲'SYSTEM',說明服務器時區與系統時區相同。能夠用--defaulttime-
zone=timez選項顯式指定初使值。若是你有SUPER 權限,能夠用下面的語句在運行時設置全局變量值:
· mysql> SET GLOBAL time_zone = timezone;

· 每一個鏈接的時區。每一個客戶端鏈接有本身的時區設置,用會話time_zone變量給出。其初使值與全局變量time_zone相同,但能夠用下面的語句重設:
· mysql> SET time_zone = timezone;
能夠用下面的方法查詢當前的全局變量值和每一個鏈接的時區:
mysql> SELECT @@global.time_zone, @@session.time_zone;
timezone值爲字符串,表示UTC的偏移量,例如'+10:00'或'-6:00'。若是已經建立並裝入mysql數據庫中的時區相關表,你還能夠使用命名的時區,例
如'Europe/Helsinki'、'US/Eastern'或'MET'。值'SYSTEM'說明該時區應與系統時區相同。時區名對大小寫不敏感。
MySQL安裝程序在mysql數據庫中建立時區表,但不裝載。你必須手動裝載。(若是你正從之前的版本升級到MySQL 4.1.3或更新版本,你應經過升級mysql數
據庫來建立表。參見2.10.2節,「升級受權表」中的說明)。
若是你的系統有本身的時區信息數據庫(描述時區的一系列文件),應使用mysql_tzinfo_to_sql程序來填充時區表。示例系統如Linux、FreeBSD、Sun
Solaris和Mac OS X。這些文件的可能位置爲/usr/share/zoneinfo目錄。若是你的系統沒有時區信息數據庫,能夠使用本節後面描述的下載的軟件包。
mysql_tzinfo_to_sql程序用來裝載時區表。在命令行中,將時區信息目錄路徑名傳遞到mysql_tzinfo_to_sql並輸出發送到mysql程序。例如:
shell> mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
mysql_tzinfo_to_sql讀取系統時區文件並生成SQL語句。mysql處理這些語句並裝載時區表。
mysql_tzinfo_to_sql還能夠用來裝載單個時區文件,並生成閏秒信息。
要想裝載對應時區tz_name的單個時區文件tz_file,應這樣調用mysql_tzinfo_to_sql:
shell> mysql_tzinfo_to_sql tz_file tz_name | mysql -u root mysql
若是你的時區須要計算閏秒,按下面方法初使化閏秒信息,其中tz_file是時區文件名:
shell> mysql_tzinfo_to_sql --leap tz_file | mysql -u root mysql
若是你的系統沒有時區信息數據庫 (例如,Windows或HP-UX),你能夠從http://dev.mysql.com/downloads/timezones.html下載預構建時區表軟件包。該軟件
包包含MyISAM時區表所用的.frm、.MYD和.MYI文件。這些表應屬於mysql數據庫,所以應將這些文件放到MySQL服務器數據目錄的mysql子目錄。操做時應
關閉服務器。
警告!若是你的系統有時區信息數據庫,請不要使用下載的軟件包。而應使用mysql_tzinfo_to_sql實用工具!不然,MySQL和系統上其它應用程序處理日
期時間的方法會有所不一樣。
 * 
 * 
 * 
 MySQL有幾個不一樣的日誌文件,能夠幫助你找出mysqld內部發生的事情:
日誌文件記入文件中的信息類型
錯誤日誌記錄啓動、運行或中止mysqld時出現的問題。
查詢日誌記錄創建的客戶端鏈接和執行的語句。
更新日誌記錄更改數據的語句。不同意使用該日誌。
二進制日誌記錄全部更改數據的語句。還用於複製。
慢日誌記錄全部執行時間超過long_query_time秒的全部查詢或不使用索引的查詢。
默認狀況下,全部日誌建立於mysqld數據目錄中。經過刷新日誌,你能夠強制mysqld來關閉和從新打開日誌文件(或者在某些狀況下切換到一個新的日
志)。當你執行一個FLUSH LOGS語句或執行mysqladmin flush-logs或mysqladmin refresh時,出現日誌刷新。參見13.5.5.2節,「FLUSH語法」。
若是你正使用MySQL複製功能,從複製服務器將維護更多日誌文件,被稱爲接替日誌 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
MySQL有幾個不一樣的日誌文件,能夠幫助你找出mysqld內部發生的事情:
日誌文件記入文件中的信息類型
錯誤日誌記錄啓動、運行或中止mysqld時出現的問題。
查詢日誌記錄創建的客戶端鏈接和執行的語句。
更新日誌記錄更改數據的語句。不同意使用該日誌。
二進制日誌記錄全部更改數據的語句。還用於複製。
慢日誌記錄全部執行時間超過long_query_time秒的全部查詢或不使用索引的查詢。
默認狀況下,全部日誌建立於mysqld數據目錄中。經過刷新日誌,你能夠強制mysqld來關閉和從新打開日誌文件(或者在某些狀況下切換到一個新的日
志)。當你執行一個FLUSH LOGS語句或執行mysqladmin flush-logs或mysqladmin refresh時,出現日誌刷新。參見13.5.5.2節,「FLUSH語法」。
若是你正使用MySQL複製功能,從複製服務器將維護更多日誌文件,被稱爲接替日誌
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
作爲服務啓動多個Windows服務器
在基於NT的系統中,MySQL服務器能夠以Windows服務的方式來運行。安裝、控制和刪除單個MySQL服務的過程描述見2.3.12節,「以Windows服務方式啓
動MySQL」。
你還能夠以服務的方式安裝多個MySQL服務器。此時,除了全部參數對每一個服務器必須是惟一的,你還必須確保每一個服務器使用不一樣的服務名。
在下面的說明中,假設你想要運行mysqld-nt服務器的兩個不一樣的版本,它們分別安裝在C:\mysql-4.1.8和C:\mysql-5.1.2-alpha目錄中。(可能存在這種情
況,若是你正在運行版本4.1.8做爲你的產品服務器,還想使用5.1.2-alpha版原本進行測試)。
當用--install或--install-manual選項安裝一個MySQL服務時,應聽從如下原則:
· 若是你沒有指定服務名,服務器使用默認的MySQL服務名,從標準選項文件的[mysqld]組中讀取選項。
· 若是你在--install選項後指定了服務名,服務器忽略[mysqld]選項組,從具備相同名的組中讀取選項做爲服務名。服務器從標準選項文件中讀取選項。
· 若是你在服務名後面指定一個--defaults-file選項,服務器忽略標準選項文件,只從命名的文件的[mysqld]組讀取選項。
註釋:MySQL 4.0.17以前,只有使用默認服務名(MySQL)安裝的一個服務器或使用服務名mysqld顯式安裝的一個服務器從標準選項文件讀[mysqld]組。
到4.0.17時,若是服務器讀標準選項文件,則它們均讀[mysqld]組,即便它們安裝時使用了另外一個服務名。這樣容許你爲選項使用[mysqld]組,用於所
有MySQL服務器,並將根據每一個服務器命名的選項組用於該服務器,即便用那個服務名安裝的服務器。
根據前面敘述,你能夠經過幾個方法來設置多個服務器。下面的說明描述了一些示例。在嘗試以前,應確保你首先關閉而且卸載了全部已有的MySQL服務
器。
· 方法1:在一個標準選項文件中指定全部服務器選項。要想這樣作,爲每一個服務器使用不一樣的服務名。假設你想使用服務名mysqld1運行4.1.8版
的mysqld-nt並使用服務名mysqld2運行5.1.2-alpha版的mysqld-nt。在這種狀況下,你能夠爲4.1.8使用[mysqld1]組,爲5.1.2-alpha使用[mysqld2]組。例
如,你能夠象這樣創建C:\my.cnf文件:
· # options for mysqld1 service
· [mysqld1]
· basedir = C:/mysql-4.1.8
· port = 3307
· enable-named-pipe
· socket = mypipe1

·
· # options for mysqld2 service
· [mysqld2]
· basedir = C:/mysql-5.1.2-alpha
· port = 3308
· enable-named-pipe
· socket = mypipe2
以下面所示安裝服務器,使用服務器的全路徑名來確保Windows爲每一個服務註冊正確的可執行程序:
C:\> C:\mysql-4.1.8\bin\mysqld-nt --install mysqld1
C:\> C:\mysql-5.1.2-alpha\bin\mysqld-nt --install mysqld2
爲了啓動服務器,使用服務管理器,或用帶有適當的服務名的NET START:
C:\> NET START mysqld1
C:\> NET START mysqld2
要想中止服務,使用服務管理器,或用帶有適當的服務名的NET STOP:
C:\> NET STOP mysqld1
C:\> NET STOP mysqld2
· 方法2:爲每一個服務器用不一樣的文件指定選項,當你安裝服務時使用--defaults-file告訴每一個服務器使用什麼文件。此時,每一個文件應用一個[mysqld]組
列出選項。
使用這種方法爲4.1.8版本的mysqld-nt指定選項,應象這樣建立一個C:\my-opts1.cnf文件:
[mysqld]
basedir = C:/mysql-4.1.8
port = 3307
enable-named-pipe
socket = mypipe1
對於5.1.2-alpha版的mysqld-nt,象這樣建立一個C:\my-opts2.cnf文件:
[mysqld]
basedir = C:/mysql-5.1.2-alpha port = 3308
enable-named-pipe
socket = mypipe2
安裝服務以下(在一個單一行中輸入每一個命令):
C:\> C:\mysql-4.1.8\bin\mysqld-nt -- installmysqld1
--defaults-file=C:\my-opts1.cnf
C:\> C:\mysql-5.1.2-alpha\bin\mysqld-nt -- installmysqld2
--defaults-file=C:\my-opts2.cnf
當你做爲服務安裝一個MySQL服務器時,要想使用--defaults-file選項,你必須在此選項以前加服務名。
安裝服務後,按照與前面的示例相同的方法啓動和中止。
要想卸載多個服務,對每一個服務使用mysqld --remove,在--remove選項後指定服務名。若是服務名是默認的(MySQL),你能夠不指定。
5.12.2. 在Unix中運行多個服務器
在Unix中運行多個服務器最容易的方法是使用不一樣的TCP/IP端口s和Unix套接字文件編譯,所以每一個實例在不一樣的網絡接口偵聽。另外,每一個安裝應在不一樣的
基礎目錄中編譯,那將自動爲你的每一個服務器產生使用不一樣的編譯進來的數據目錄、日誌文件和PID文件位置。
假設一個現有的4.1.8版本服務器配置爲默認TCP/IP端口號(3306)和Unix套接字文件(/tmp/mysql.sock)。要想配置一個新的5.1.2-alpha版的服務器來使用不一樣
的操做參數,使用一個configure命令,大概象這樣使用:
shell> ./configure --with-tcp-port=port_number \
--with-unix-socket-path=file_name \
--prefix=/usr/local/mysql-5.1.2-alpha
這裏,port_number和file_name必須不一樣於默認TCP/IP端口號和Unix套接字文件路徑名,而且--prefix值應指定一個不一樣於現有MySQL安裝目錄的安裝目錄。
若是你有一個MySQL服務器正偵聽一個給定的端口號,你能夠使用下面的命令來找出針對一些重要配置變量它使用了那些操做參數,包括基礎目錄和Unix套
接字文件名:
shell>mysqladmin --host=host_name --port=port_number variables
經過該命令顯示的信息,當配置其它服務器時,你能夠告訴服務器該選項沒有使用的值。
請注意,若是你指定localhost做爲一個主機名,mysqladmin默認使用Unix套接字文件鏈接,而不是TCP/IP。從 MySQL 4.1開始,經過--protocol= TCP |
SOCKET | PIPE | MEMORY}選項,你能夠顯示地指定鏈接協議。
若是隻是用一個不一樣的Unix套接字文件和TCP/IP端口號啓動,沒必要編譯新的MySQL服務器。還能夠在運行時指定這些值。這樣作的一個方法是使用命令行選
項:
shell> mysqld_safe --socket=file_name --port=port_number
要啓動第二個服務器,提供不一樣的--socket和--port選項值,而且傳遞一個--datadir=path選項給mysqld_safe,以便服務器使用一個不一樣的數據目錄。
達到類似效果的另外一個方法是使用環境變量來設置 Unix套接字文件名和TCP/IP端口號:
shell> MYSQL_UNIX_PORT=/tmp/mysqld-new.sock
shell> MYSQL_TCP_PORT=3307
shell> export MYSQL_UNIX_PORT MYSQL_TCP_PORT
shell> mysql_install_db --user=mysql
shell> mysqld_safe --datadir=/path/to/datadir &
這是一個快速啓動第二個服務器以用於測試的方法。該方法的最大好處是環境變量設定值適用於你從相同的shell調用的任何客戶端程序。於是,那些客戶端
鏈接自動指向第二個服務器!
附錄F:環境變量包括你能夠使用的影響mysqld的其它環境變量列表。
對於自動服務器啓動,對於每一個服務器,機器引導時執行的啓動腳本應執行下面的命令,每一個命令用一個相應的選項文件路徑:
mysqld_safe --defaults-file=path
每一個選項文件應包含一個給定服務器特定的選項值。
在Unix中,mysqld_multi腳本是啓動多個服務器的另外一個方法
 * 
 * 
 * 
 * 
在多服務器環境中使用客戶端程序
當你想要用一個客戶端程序鏈接一個MySQL服務器時,該服務器偵聽不一樣的網絡接口,而不是編譯到你的客戶端的網絡接口,你能夠使用下面的方法:
· 啓動客戶端,用--host=host_name --port=port_number經過TCP/IP來鏈接一個遠程服務器,用--host=127.0.0.1 --port=port_number經過TCP/IP來
鏈接一個本地服務器,或者用--host=localhost --socket=file_name經過一個Unix套接字文件或一個Windows命名管道來鏈接一個本地服務器。
· 從MySQL 4.1起,啓動客戶端時用--protocol=tcp經過TCP/IP來鏈接,用--protocol=socket經過一個Unix套接字文件來鏈接,用--protocol=pipe經過一
個命名管道來鏈接,或用--protocol=memory經過共享內存來鏈接。對於TCP/IP鏈接,你可能還須要指定--host和--port選項。對於其它類型的鏈接,你可能
須要指定一個--socket選項來指定一個Unix套接字文件或命名管道名,或者一個--shared-memory-base-name選項來指定共享內存名。共享內存鏈接僅
在Windows中支持。
· 在Unix中,在你啓動客戶端以前,設置MYSQL_UNIX_PORT和MYSQL_TCP_PORT環境變量來指定Unix套接字文件和TCP/IP端口號。若是你常用具
體的套接字文件或端口號,你能夠在.login文件中放置命令來設置環境變量以便你每次登陸時該命令起做用。參見附錄F:環境變量。
· 在一個選項文件的[client]組中指定默認Unix套接字文件和TCP/IP端口號。例如,你能夠在Windows中使用C:\my.cnf文件,或在Unix中主目錄內使
用.my.cnf文件。參見4.3.2節,「使用選項文件」。
· 在C程序中,在mysql_real_connect()調用時,你能夠指定套接字文件或端口號參數。經過調用mysql_options(),你還能夠有程序讀選項文件。參
見25.2.3節,「C API函數描述」。
· 若是你正在使用Perl DBD::mysql模塊,你能夠從MySQL選項文件中讀取選項。例如:
· $dsn = "DBI:mysql:test;mysql_read_default_group=client;"
· . "mysql_read_default_file=/usr/local/mysql/data/my.cnf";
· $dbh = DBI->connect($dsn, $user, $password);
參見25.4節,「MySQL Perl API」。
其它程序接口能夠爲讀選項文件提供類似的功能。 
 * 
 * 
 * 
 * 
查詢高速緩衝如何工做
本節描述查詢緩存的工做原理。5.13.3節,「查詢高速緩衝配置」描述了怎樣控制是否使用查詢緩存。
查詢解析以前進行比較,所以下面的兩個查詢被查詢緩存認爲是不相同的:
SELECT * FROM tbl_name
Select * from tbl_name
查詢必須是徹底相同的(逐字節相同)纔可以被認爲是相同的。另外,一樣的查詢字符串因爲其它緣由可能認爲是不一樣的。使用不一樣的數據庫、不一樣的協議版
本或者不一樣默認字符集的查詢被認爲是不一樣的查詢而且分別進行緩存。
從查詢緩存中提取一個查詢以前,MySQL檢查用戶對全部相關數據庫和表的SELECT權限。若是沒有權限,不使用緩存結果。
若是從查詢緩存中返回一個查詢結果,服務器把Qcache_hits狀態變量的值加一,而不是Com_select變量。參見5.13.4節,「查詢高速緩衝狀態和維護」。
若是一個表被更改了,那麼使用那個表的全部緩衝查詢將再也不有效,而且從緩衝區中移出。這包括那些映射到改變了的表的使用MERGE表的查詢。一個表可
以被許多類型的語句更改,例如INSERT、UPDATE、DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE。
COMMIT執行完後,被更改的事務InnoDB表再也不有效。
使用InnoDB表時,查詢緩存也在事務中工做,使用該表的版本號來檢測其內容是否仍舊是當前的。
在MySQL 5.1中,視圖產生的查詢被緩存。
SELECT SQL_CALC_FOUND_ROWS ...和SELECT FOUND_ROWS() type類型的查詢使用查詢緩存。即便因建立的行數也被保存在緩衝區內,前面的查詢從緩
存中提取,FOUND_ROWS()也返回正確的值。
若是一個查詢包含下面函數中的任何一個,它不會被緩存:
BENCHMARK() CONNECTION_ID() CURDATE()
CURRENT_DATE() CURRENT_TIME() CURRENT_TIMESTAMP()
CURTIME() DATABASE() 帶一個參數的ENCRYPT()
FOUND_ROWS() GET_LOCK() LAST_INSERT_ID()
LOAD_FILE() MASTER_POS_WAIT() NOW()
RAND() RELEASE_LOCK() SYSDATE()
不帶參數的UNIX_TIMESTAMP() USER()
在下面的這些條件下,查詢也不會被緩存:
· 引用自定義函數(UDFs)。
· 引用自定義變量。
· 引用mysql系統數據庫中的表。
· 下面方式中的任何一種:
SELECT ...IN SHARE MODE
SELECT ...FOR UPDATE
SELECT ...INTO OUTFILE ...
SELECT ...INTO DUMPFILE ...
SELECT * FROM ...WHERE autoincrement_col IS NULL
最後一種方式不能被緩存是由於它被用做爲ODBC工做區來獲取最近插入的ID值。參見26.1.14.1節,「如何在ODBC中獲取AUTO_INCREMENT列的值」。

· 被做爲編寫好的語句,即便沒有使用佔位符。例如,下面使用的查詢:
char *my_sql_stmt = "SELECT a,b FROM table_c";
/* ...*/
mysql_stmt_prepare(stmt,my_sql_stmt,strlen(my_sql_stmt));
不被緩存。參見25.2.4節,「C API預處理語句」。
· 使用TEMPORARY表。
· 不使用任何表。
· 用戶有某個表的列級權限。 
 * 
 * 
 * 
 * 
 * 
 * 
查詢高速緩衝SELECT選項
能夠在SELECT語句中指定查詢緩存相關選項:
· SQL_CACHE
若是query_cache_type系統變量的值是ON或DEMAND,查詢結果被緩存。
· SQL_NO_CACHE
查詢結果不被緩存。
示例:
SELECT SQL_CACHE id, name FROM customer;
SELECT SQL_NO_CACHE id, name FROM customer;
5.13.3. 查詢高速緩衝配置
經過have_query_cache服務器系統變量指示查詢緩存是否可用:
mysql> SHOW VARIABLES LIKE 'have_query_cache';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| have_query_cache | YES |
+------------------+-------+
即便禁用查詢緩存,當使用標準 MySQL二進制時,這個值老是YES。
其它幾個系統變量控制查詢緩存操做。當啓動mysqld時,這些變量能夠在選項文件或者命令行中設置。全部查詢緩存系統變量名以query_cache_ 開頭。它
們的詳細描述見5.3.3節,「服務器系統變量」,還給出了額外的配置信息。
爲了設置查詢緩存大小,設置query_cache_size系統變量。設置爲0表示禁用查詢緩存。默認緩存大小設置爲0;也就是禁用查詢緩存。
當設置query_cache_size變量爲非零值時,應記住查詢緩存至少大約須要40KB來分配其數據結構。(具體大小取決於系統結構)。若是你把該值設置的過小,
將會獲得一個警告,如本例所示:
mysql> SET GLOBAL query_cache_size = 40000;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> SHOW WARNINGS\G
*************************** 1. row ***************************
Level: Warning
Code: 1282
Message: Query cache failed to set size 39936; new query cache size is 0
mysql> SET GLOBAL query_cache_size = 41984;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW VARIABLES LIKE 'query_cache_size';

+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| query_cache_size | 41984 |
+------------------+-------+
若是查詢緩存大小設置爲大於0,query_cache_type變量影響其工做方式。這個變量能夠設置爲下面的值:
· 0或OFF將阻止緩存或查詢緩存結果。
· 1或ON將容許緩存,以SELECT SQL_NO_CACHE開始的查詢語句除外。
· 2或DEMAND,僅對以SELECT SQL_CACHE開始的那些查詢語句啓用緩存。
設置query_cache_type變量的GLOBAL值將決定更改後全部鏈接客戶端的緩存行爲。具體客戶端能夠經過設置query_cache_type變量的會話值控制它們自己連
接的緩存行爲。例如,一個客戶能夠禁用本身的查詢緩存,方法以下:
mysql> SET SESSION query_cache_type = OFF;
要控制能夠被緩存的具體查詢結果的最大值,應設置query_cache_limit變量。默認值是1MB。
當一個查詢結果(返回給客戶端的數據)從查詢緩衝中提取期間,它在查詢緩存中排序。所以,數據一般不在大的數據塊中處理。查詢緩存根據數據排序要
求分配數據塊,所以,當一個數據塊用完後分配一個新的數據塊。由於內存分配操做是昂貴的(費時的),因此經過query_cache_min_res_unit系統變量給查詢
緩存分配最小值。當查詢執行時,最新的結果數據塊根據實際數據大小來肯定,所以能夠釋放不使用的內存。根據你的服務器執行查詢的類型,你會發現調
整query_cache_min_res_unit變量的值是有用的:
· query_cache_min_res_unit默認值是4KB。這應該適合大部分狀況。
· 若是你有大量返回小結果數據的查詢,默認數據塊大小可能會致使內存碎片,顯示爲大量空閒內存塊。因爲缺乏內存,內存碎片會強制查詢緩存從緩
存內存中修整(刪除)查詢。這時,你應該減小query_cache_min_res_unit變量的值。空閒塊和因爲修整而移出的查詢的數量通
過Qcache_free_blocks和Qcache_lowmem_prunes變量的值給出。
· 若是大量查詢返回大結果(檢查 Qcache_total_blocks和Qcache_queries_in_cache狀態變量),你能夠經過增長query_cache_min_res_unit變量的值
來提升性能。可是,注意不要使它變得太大(參見前面的條目)。
5.13.4. 查詢高速緩衝狀態和維護
能夠使用下面的語句檢查MySQL服務器是否提供查詢緩存功能:
mysql> SHOW VARIABLES LIKE 'have_query_cache';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| have_query_cache | YES |
+------------------+-------+
能夠使用FLUSH QUERY CACHE語句來清理查詢緩存碎片以提升內存使用性能。該語句不從緩存中移出任何查詢。
RESET QUERY CACHE語句從查詢緩存中移出全部查詢。FLUSH TABLES語句也執行一樣的工做。
爲了監視查詢緩存性能,使用SHOW STATUS查看緩存狀態變量:
mysql> SHOW STATUS LIKE 'Qcache%';
+-------------------------+--------+
|變量名 |值 |
+-------------------------+--------+
| Qcache_free_blocks | 36 |
| Qcache_free_memory | 138488 |
| Qcache_hits | 79570 |
| Qcache_inserts | 27087 |
| Qcache_lowmem_prunes | 3114 |
| Qcache_not_cached | 22989 |
| Qcache_queries_in_cache | 415 |
| Qcache_total_blocks | 912 |
+-------------------------+--------+

這些變量的描述見5.3.4節,「服務器狀態變量」。這裏描述它們的一些應用。
SELECT查詢的總數量等價於:
Com_select
+ Qcache_hits
+ queries with errors found by parser
Com_select的值等價於:
Qcache_inserts
+ Qcache_not_cached
+ queries with errors found during columns/rights check
查詢緩存使用長度可變塊,所以Qcache_total_blocks和Qcache_free_blocks能夠顯示查詢緩存內存碎片。執行FLUSH QUERY CACHE後,只保留一個空閒塊。
每一個緩存查詢至少須要兩個塊(一個塊用於查詢文本,一個或多個塊用於查詢結果)。而且,每個查詢使用的每一個表須要一個塊。可是,若是兩個或多個
查詢使用相同的表,僅須要分配一個塊。
Qcache_lowmem_prunes狀態變量提供的信息可以幫助你你調整查詢緩存的大小。它計算爲了緩存新的查詢而從查詢緩衝區中移出到自由內存中的查詢的數
目。查詢緩衝區使用最近最少使用(LRU)策略來肯定哪些查詢從緩衝區中移出。調整信息在5.13.3節,「查詢高速緩衝配置」中給出。
 * 
 * 
 * 
 * 
從服務器設置爲複製主服務器的數據後,它鏈接主服務器並等待更新過程。若是主服務器失敗,或者從服務器
失去與主服務器之間的鏈接,從服務器保持按期嘗試鏈接,直到它可以繼續幀聽更新。由--master-connectretry
選項控制重試間隔。默認爲60秒
 * 
 * 

複製實施細節
MySQL使用3個線程來執行復制功能(其中1個在主服務器上,另兩個在從服務器上。當發出START SLAVE時,
從服務器建立一個I/O線程,以鏈接主服務器並讓它發送記錄在其二進制日誌中的語句。主服務器建立一個線
程將二進制日誌中的內容發送到從服務器。該線程能夠識別爲主服務器上SHOW PROCESSLIST的輸出中
的Binlog Dump線程。從服務器I/O線程讀取主服務器Binlog Dump線程發送的內容並將該數據拷貝到從服務器
數據目錄中的本地文件中,即中繼日誌。第3個線程是SQL線程,是從服務器建立用於讀取中繼日誌並執行日
志中包含的更新。
在前面的描述中,每一個從服務器有3個線程。有多個從服務器的主服務器建立爲每一個當前鏈接的從服務器建立
一個線程;每一個從服務器有本身的I/O和SQL線程。
這樣讀取和執行語句被分紅兩個獨立的任務。若是語句執行較慢則語句讀取任務沒有慢下來。例如,若是從服
I/O

務器有一段時間沒有運行了,當從服務器啓動時,其線程能夠很快地從主服務器索取全部二進制日誌內
容,即便SQL線程遠遠滯後。若是從服務器在SQL線程執行完全部索取的語句前中止,I/O 線程至少已經索取
了全部內容,以便語句的安全拷貝保存到本地從服務器的中繼日誌中,供從服務器下次啓動時執行。這樣容許
清空主服務器上的二進制日誌,由於再也不須要等候從服務器來索取其內容。
SHOW PROCESSLIST語句能夠提供在主服務器上和從服務器上發生的關於複製的信息。
下面的例子說明了這3個線程在SHOW PROCESSLIST中的顯示。
在主服務器上,SHOW PROCESSLIST的輸出看上去應爲:
mysql> SHOW PROCESSLIST\G
*************************** 1. row ***************************
Id: 2
User: root
Host: localhost:32931
db: NULL
Command: Binlog Dump
Time: 94
State: Has sent all binlog to slave; waiting for binlog to
be updated
Info: NULL
這兒,線程2是一個鏈接從服務器的複製線程。該信息表示全部主要更新已經被髮送到從服務器,主服務器正
等待更多的更新出現。
在從服務器上,SHOW PROCESSLIST的輸出看上去應爲:
mysql> SHOW PROCESSLIST\G
*************************** 1. row ***************************
Id: 10
User: system user
Host:
db: NULL
Command: Connect
Time: 11
State: Waiting for master to send event
Info: NULL
*************************** 2. row ***************************
Id: 11
User: system user
Host:
db: NULL
Command: Connect
Time: 11

State: Has read all relay log; waiting for the slave I/O
thread to update it
Info: NULL
該信息表示線程10是同主服務器通訊的I/O線程,線程11是處理保存在中繼日誌中的更新的SQL線程。SHOW
PROCESSLIST運行時,兩個線程均空閒,等待其它更新。
請注意Time列的值能夠顯示從服務器比主服務器滯後多長時間
 * 
 * 
 * 
 * 
 * 
 * 
 * 
複製主線程狀態
下面列出了主服務器的Binlog Dump線程的State列的最多見的狀態。若是你沒有在主服務器上看見任何Binlog
Dump線程,這說明覆制沒有在運行—即,目前沒有鏈接任何從服務器。
· Sending binlog event to slave
二進制日誌由各類事件組成,一個事件一般爲一個更新加一些其它信息。線程已經從二進制日誌讀取了一個事
件而且正將它發送到從服務器。
· Finished reading one binlog; switching to next binlog
線程已經讀完二進制日誌文件而且正打開下一個要發送到從服務器的日誌文件。
· Has sent all binlog to slave; waiting for binlog to be updated
線程已經從二進制日誌讀取全部主要的更新並已經發送到了從服務器。線程如今正空閒,等待由主服務器上新
的更新致使的出如今二進制日誌中的新事件。
· Waiting to finalize termination
線程中止時發生的一個很簡單的狀態。
6.3.2. 複製從I/O線程狀態
下面列出了從服務器的I/O線程的State列的最多見的狀態。該狀態也出如今Slave_IO_State列,由SHOW
SLAVE STATUS顯示。這說明你能夠只經過該語句仔細瀏覽所發生的事情。
· Connecting to master
線程正試圖鏈接主服務器。
· Checking master version
創建同主服務器之間的鏈接後當即臨時出現的狀態。
· Registering slave on master
創建同主服務器之間的鏈接後當即臨時出現的狀態。
· Requesting binlog dump
創建同主服務器之間的鏈接後當即臨時出現的狀態。線程向主服務器發送一條請求,索取從請求的二進制日誌
文件名和位置開始的二進制日誌的內容。
· Waiting to reconnect after a failed binlog dump request

若是二進制日誌轉儲請求失敗(因爲沒有鏈接),線程進入睡眠狀態,而後按期嘗試從新鏈接。能夠使用--
master-connect-retry選項指定重試之間的間隔。
· Reconnecting after a failed binlog dump request
線程正嘗試從新鏈接主服務器。
· Waiting for master to send event
線程已經鏈接上主服務器,正等待二進制日誌事件到達。若是主服務器正空閒,會持續較長的時間。若是等待
持續slave_read_timeout秒,則發生超時。此時,線程認爲鏈接被中斷並企圖從新鏈接。
· Queueing master event to the relay log
線程已經讀取一個事件,正將它複製到中繼日誌供SQL線程來處理。
· Waiting to reconnect after a failed master event read
讀取時(因爲沒有鏈接)出現錯誤。線程企圖從新鏈接前將睡眠master-connect-retry秒。
· Reconnecting after a failed master event read
線程正嘗試從新鏈接主服務器。當鏈接從新創建後,狀態變爲Waiting for master to send event。
· Waiting for the slave SQL thread to free enough relay log space
正使用一個非零relay_log_space_limit值,中繼日誌已經增加到其組合大小超過該值。I/O線程正等待直
到SQL線程處理中繼日誌內容並刪除部分中繼日誌文件來釋放足夠的空間。
· Waiting for slave mutex on exit
線程中止時發生的一個很簡單的狀態。
6.3.3. 複製從SQL線程狀態
下面列出了從服務器的SQL線程的State列的最多見的狀態。
· Reading event from the relay log
線程已經從中繼日誌讀取一個事件,能夠對事件進行處理了。
· Has read all relay log; waiting for the slave I/O thread to update it
線程已經處理了中繼日誌文件中的全部事件,如今正等待I/O線程將新事件寫入中繼日誌。
· Waiting for slave mutex on exit
線程中止時發生的一個很簡單的狀態。
I/O線程的State列也能夠顯示語句的文本。這說明線程已經從中繼日誌讀取了一個事件,從中提取了語句,並
且正在執行語句。
6.3.4. 複製傳遞和狀態文件
默認狀況,中繼日誌使用host_name-relay-bin.nnnnnn形式的文件名,其中host_name是從服務器主機

名,nnnnnn是序列號。用連續序列號來建立連續中繼日誌文件,從000001開始。從服務器跟蹤索引文件中目
前正使用的中繼日誌。默認中繼日誌索引文件名爲host_name-relay-bin.index。默認狀況,在從服務器的數據
目錄中建立這些文件。能夠用--relay-log和--relay-log-index服務器選項覆蓋默認文件名。參見6.8節,「複製啓
動選項」。
中繼日誌與二進制日誌的格式相同,而且能夠用mysqlbinlog讀取。SQL線程執行完中繼日誌中的全部事件並
且再也不須要以後,當即自動刪除它。沒有直接的刪除中繼日誌的機制,由於SQL線程能夠負責完成。然
而,FLUSH LOGS能夠循環中繼日誌,當SQL線程刪除日誌時會有影響。
在下面的條件下建立新的中繼日誌:
· 每次I/O線程啓動時建立一個新的中繼日誌。
· 當日志被刷新時;例如,用FLUSH LOGS或mysqladmin flush-logs。
· 噹噹前的中繼日誌文件變得太大時。「太大」含義的肯定方法:
o max_relay_log_size,若是max_relay_log_size > 0
o max_binlog_size,若是max_relay_log_size = 0
從屬複製服務器在數據目錄中另外建立兩個小文件。這些狀態文件默認名爲主master.info和relay-log.info。它
們包含SHOW SLAVE STATUS語句的輸出所顯示的信息(關於該語句的描述參見13.6.2節,「用於控制從服務器
的SQL語句」)。狀態文件保存在硬盤上,從服務器關閉時不會丟失。下次從服務器啓動時,讀取這些文件以確
定它已經從主服務器讀取了多少二進制日誌,以及處理本身的中繼日誌的程度。
由I/O線程更新master.info文件。文件中的行和SHOW SLAVE STATUS顯示的列的對應關係爲:
行描述
1 文件中的行號
2 Master_Log_File
3 Read_Master_Log_Pos
4 Master_Host
5 Master_User
6 密碼(不禁SHOW SLAVE STATUS顯示)
7 Master_Port
8 Connect_Retry
9 Master_SSL_Allowed
10 Master_SSL_CA_File
11 Master_SSL_CA_Path
12 Master_SSL_Cert
13 Master_SSL_Cipher
14 Master_SSL_Key
由SQL線程更新relay-log.info文件。文件中的行和SHOW SLAVE STATUS顯示的列的對應關係爲:
行描述
1 Relay_Log_File
2 Relay_Log_Pos
3 Relay_Master_Log_File
4 Exec_Master_Log_Pos
Chapter 6. Replication in MySQL
file:///D:/download/refman-5.1-zh.html-chapter/refman-5.1-zh.html-chapter/replication.html[2010/2/24 5:22:02]
當備份從服務器的數據時,你還應備份這兩個小文件以及中繼日誌文件。它們用來在恢復從服務器的數據後繼
續進行復制。若是丟失了中繼日誌但仍然有relay-log.info文件,你能夠經過檢查該文件來肯定SQL線程已經執
行的主服務器中二進制日誌的程度。而後能夠用Master_Log_File和Master_LOG_POS選項執行CHANGE
MASTER TO來告訴從服務器從新從該點讀取二進制日誌。固然,要求二進制日誌仍然在主服務器上。
若是從服務器正複製LOAD DATA INFILE語句,你應也備份該目錄內從服務器用於該目的的任何SQL_LOAD-
*文件。從服務器須要這些文件繼續複製任何中斷的LOAD DATA INFILE操做。用--slave-load-tmpdir選項來指
定目錄的位置。若是未指定, 默認值爲tmpdir變量的值。
 * 
 * 
 * 
 * 
 * 
 * 
 * 
假定你的域爲mydomain.com,想要建立用戶名爲repl的一個帳戶,從服務器能夠使用該帳戶從你的域內的任何
主機使用密碼slavepass來訪問主服務器。要建立該帳戶,可以使用GRANT語句:
mysql> GRANT REPLICATION SLAVE ON *.*
-> TO 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';
若是你計劃從從屬服務器主機使用LOAD TABLE FROM MASTER或LOAD DATA FROM MASTER語句,你須要授
予該帳戶其它權限:
· 授予帳戶SUPER和RELOAD全局權限。
· 爲全部想要裝載的表授予SELECT權限。任何該帳戶不能SELECT的主服務器上的表被LOAD DATA
FROM MASTER忽略掉。
3. 執行FLUSH TABLES WITH READ LOCK語句清空全部表和塊寫入語句:
4. mysql> FLUSH TABLES WITH READ LOCK;
對於InnoDB表,請注意:FLUSH TABLES WITH READ LOCK還鎖定COMMIT操做。當得到全局讀鎖定後,能夠

開始InnoDB表的文件系統快照。快照不能保證內部(在InnoDB存儲引擎內部)一致性(由於InnoDB緩存沒有刷
新),但並不須要關心該問題,由於InnoDB能夠在啓動時解決該問題並給出一致的結果。這說明InnoDB在啓動
快照時能夠進行崩潰恢復,而不會破壞。然而,當保證一致的InnoDB錶快照時,尚未途徑來中止MySQL服
務器。
讓客戶程序保持運行,發出FLUSH TABLES語句讓讀鎖定保持有效。(若是退出客戶程序,鎖被釋放)。而後對
主服務器上的數據進行快照。
建立快照最簡單的途徑是使用歸檔程序對主服務器上的數據目錄中的數據庫進行二進制備份。例如,在Unix中
使用tar,或者在Windows中使用PowerArchiver、WinRAR、WinZip或者相似的軟件。要使用tar來建立包
括全部數據庫的歸檔文件,進入主服務器的數據目錄,而後執行命令:
shell> tar -cvf /tmp/mysql-snapshot.tar .
若是你想讓歸檔只包括this_db數據庫,應使用命令:
shell> tar -cvf /tmp/mysql-snapshot.tar ./this_db
而後將歸檔文件複製到從服務器主機的/tmp目錄。在該機器上,進入從服務器的數據目錄,並使用下述命令解
壓縮歸檔文件:
shell> tar -xvf /tmp/mysql-snapshot.tar
若是從服務器的用戶帳戶與主服務器的不一樣,你可能不想複製mysql數據庫。在這種狀況下,應從歸檔中排除
該數據庫。你也不須要在歸檔中包括任何日誌文件或者master.info或relay-log.info文件。
當FLUSH TABLES WITH READ LOCK所置讀鎖定有效時,讀取主服務器上當前的二進制日誌名和偏移量值:
mysql > SHOW MASTER STATUS;
+---------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| mysql-bin.003 | 73 | test | manual,mysql |
+---------------+----------+--------------+------------------+
File列顯示日誌名,而Position顯示偏移量。在該例子中,二進制日誌值爲mysql-bin.003,偏移量爲73。記錄
該值。之後設置從服務器時須要使用這些值。它們表示複製座標,從服務器應從該點開始從主服務器上進行新
的更新。
取得快照並記錄日誌名和偏移量後,能夠在主服務器上從新啓用寫活動:
mysql> UNLOCK TABLES;
若是你正使用InnoDB表,理想狀況應使用InnoDB Hot Backup工具,使用該工具能夠得到一致的快照而不需
要在主服務器上進行鎖定,而且能夠對應從服務器上使用的快照來記錄日誌名和偏移量。Hot Backup是一個
附加的非免費(商業)工具,沒有包含在標準 MySQL分發中。詳細信息參
見http://www.innodb.com/manual.php的InnoDB Hot Backup主頁。
不使用Hot Backup工具,最快捷的途徑是使用InnoDB表的二進制快照來關閉主服務器並複製InnoDB數據文
件、日誌文件和表定義文件(.frm文件)。要記錄當前的日誌文件名和偏移量,關閉服務器以前應發出下面的語
句:
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;

而後記錄前面所示的SHOW MASTER STATUS的輸出中顯示的日誌名和偏移量。記錄日誌名和偏移量後,不解
鎖表關閉服務器以確保服務器關閉時的快照與當前的日誌文件和偏移量相對應:
shell> mysqladmin -u root shutdown
適合MyISAM和InnoDB表的另外一個方法是對主服務器上的SQL進行轉儲而不是對前面討論的二進制複製進行轉
儲。爲了實現,能夠在主服務器上使用mysqldump --master-data,之後將SQL轉儲文件裝入從服務器。但
是,這樣比二進制複製要慢一些。
若是主服務器運行時沒有啓用--logs-bin,SHOW MASTER STATUS或mysqldump --master-data顯示的日
志名和位置值爲空。在這種狀況下,當之後指定從服務器的日誌文件和位置時須要使用的值爲空字符串('')和4.
5. 確保主服務器主機上my.cnf文件的[mysqld]部分包括一個log-bin選項。該部分還應有一個serverid=
Master_id選項,其中master_id必須爲1到232–1之間的一個正整數值。例如:
6. [mysqld]
7. log-bin=mysql-bin
8. server-id=1
若是沒有提供那些選項,應添加它們並重啓服務器。
9. 中止用於從服務器的服務器並在其my.cnf文件中添加下面的行:
10. [mysqld]
11. server-id=slave_id
slave_id值同Master_id值同樣,必須爲1到232–1之間的一個正整數值。而且,從服務器的ID必須與主服務器
的ID不相同。例如:
[mysqld]
server-id=2
若是設置多個從服務器,每一個從服務器必須有一個惟一的server-id值,必須與主服務器的以及其它從服務器的
不相同。能夠認爲server-id值相似於IP地址:這些ID值能惟一識別複製服務器羣集中的每一個服務器實例。
若是不指定一個server-id值,若是沒有定義master-host,則將它設置爲1;不然設置爲2。請注意若是serverid
太長,主服務器拒絕全部來自從服務器的鏈接,而且從服務器拒絕鏈接到主服務器。這樣,省略server-id只
適合用二進制日誌備份。
12.若是對主服務器的數據進行二進制備份,啓動從服務器以前將它複製到從服務器的數據目錄中。確保對這
些文件和目錄的權限正確。服務器 MySQL運行的用戶必須可以讀寫文件,如同在主服務器上同樣。
若是使用mysqldum備份,先啓動從服務器(看下一步)。
13.啓動從服務器。若是前面已經複製了,用--skip-slave-start選項啓動從服務器,以便它不當即嘗試鏈接主服
務器。你也可能想要用--logs-warnings選項啓動從服務器(默認設置啓用),以便在錯誤日誌中顯示更多的問題
相關的信息(例如,網絡或鏈接問題)。放棄的鏈接將記入錯誤日誌,除非其值大於1。
14.若是使用mysqldump備份主服務器的數據,將轉儲文件裝載到從服務器:
15. shell> mysql -u root -p < dump_file.sql
16. 在從服務器上執行下面的語句,用你的系統的實際值替換選項值:
17. mysql> CHANGE MASTER TO
18. -> MASTER_HOST='master_host_name',

19. -> MASTER_USER='replication_user_name',
20. -> MASTER_PASSWORD='replication_password',
21. -> MASTER_LOG_FILE='recorded_log_file_name',
22. -> MASTER_LOG_POS=recorded_log_position;
下面的表顯示了字符串選項的最大長度:
Master_Host 60
Master_USER 16
Master_PASSWORD 32
Master_Log_File 255
23.啓動從服務器線程:
24. mysql> START SLAVE;
執行這些程序後,從服務器應鏈接主服務器,並補充自從快照以來發生的任何更新。
若是你忘記設置主服務器的server-id值,從服務器不能鏈接主服務器。
若是你忘記設置從服務器的server-id值,在從服務器的錯誤日誌中會出現下面的錯誤:
Warning: You should set server-id to a non-0 value if master_host is set;
we will force server id to 2, but this MySQL server will not act as a slave.
若是因爲其它緣由不能複製,從服務器的錯誤日誌中也會出現錯誤消息。
從服務器複製時,會在其數據目錄中發現文件dmaster.info和relay-log.info。從服務器使用這兩個文件跟蹤已
經處理了多少主服務器的二進制日誌。不要移除或編輯這些文件,除非你確切知你正在作什麼並徹底理解其意
義。即便這樣,最好是使用CHANGE MASTER TO語句。
註釋:master.info的內容會覆蓋命令行或in my.cnf中指定的部分選項。詳情參見6.8節,「複製啓動選項」。
有了一個快照,你能夠用它根據剛剛描述的從服務器部分來設置其它從服務器。你不須要主服務器的另外一個快
照;每一個從服務器能夠使用相同的快照。
註釋:爲了保證事務InnoDB複製設置的最大可能的耐受性和一致性,應在主服務器的my.cnf文件中使
用innodb_flush_log_at_trx_commit=1和sync-binlog=1* 
 * 
 * 
 * 
 * 
複製特性和已知問題
通常原則,SQL級複製兼容性要求主服務器和從服務器均支持使用的特性。例如,在MySQL 5.0.0中開始使
用TIMESTAMPADD()函數。若是在主服務器上使用該函數,不能複製到MySQL 5.0.0以前的從服務器。若是你
計劃在5.1和之前版本的MySQL之間進行復制,你應查閱對應之前版本系列的MySQL參考手冊,查詢該系列復
制特徵相關信息。
下面列出了關於支持什麼和不支持什麼的詳細信息。關於複製的其它InnoDB具體信息參
見15.2.6.5節,「InnoDB和MySQL複製」。
關於保存的程序和觸發器的複製問題在20.4節,「存儲子程序和觸發程序的二進制日誌功能」中討論。
· 用AUTO_INCREMENT、LAST_INSERT_ID()和TIMESTAMP值正確實現複製。
· USER()、UUID()和LOAD_FILE()函數毫無改變地被,這樣不能可靠地在從服務器上工做。
· 下面的限制只適合基於語句的複製,而不是基於行的複製。處理用戶級鎖定的函
數GET_LOCK()、RELEASE_LOCK()、IS_FREE_LOCK()、IS_USED_LOCK()複製時從服務器不知道在主服務器
上同時進行的相關文本;所以若是從服務器上的內容不一樣,這些函數不用來插入到主服務器的表中(例如不執
行INSERT INTO mytable VALUES(GET_LOCK(...)))。
· 在MySQL 5.1中FOREIGN_KEY_CHECKS、SQL_MODE、UNIQUE_CHECKS和SQL_AUTO_IS_NULL變量
均複製。但TABLE_TYPE,即STORAGE_ENGINE變量不復制,有利於在不一樣的存儲引擎之間進行復制。
· 即便主服務器和從服務器有不一樣的全局字符集變量,以及即便有不一樣的全局時區變量仍能夠複製。

· 下面適合使用不一樣字符集的MySQL服務器之間的複製:
1. 必須在主服務器和從服務器上老是使用相同的全局字符集和校對規則(--default-character-set、--defaultcollation)
。不然,會在從服務器上遇到複製鍵值錯誤,由於在主服務器的字符集中被認爲是惟一的鍵值在從服
務器的字符集中可能不是惟一的。
2. 若是主服務器早於MySQL 4.1.3,則會話中的字符集不該與其全局值不一樣(換句話說,不要使用SET
NAMES、SET CHARACTER SET等等),由於從服務器不知道該字符集的更改。若是主服務器和從服務器均
爲4.1.3或更新版,能夠隨便將會話的字符集變量設置爲本地值(例如NAMES、CHARACTER
SET、COLLATION_CLIENT和COLLATION_SERVER),由於這些設定值被寫入二進制日誌,所以從服務器知
道。然而,禁止更改會話中這些變量的全局值;如前面所述,主服務器和從服務器必須具備惟一的全局字符集
值。
3. 若是在主服務器上的數據庫的字符集與全局collation_server值不一樣,則應設計CREATE TABLE語句,以便
它們不隱含依賴數據庫的默認字符集(Bug #2326);一個好的解決辦法是在CREATE TABLE中明顯說明字符集
和校對規則。
· 應在主服務器和從服務器上設置相同的系統時區。不然一些語句,例如使
用NOW()或FROM_UNIXTIME()函數的語句,將不會正確複製。能夠使用腳本mysqld_safe的--
timezone=timezone_name選項或經過設置TZ環境變量設置MySQL服務器運行的系統的時區。主服務器和從服
務器還應有相同的默認鏈接時區設置;即主服務器和從服務器應有相同的--default-time-zone參數值。
· CONVERT_TZ(...,...,@global.time_zone)不能正確複製。只有主服務器和從服務器均爲5.0.4或更新版才
能正確複製CONVERT_TZ(...,...,@session.time_zone)。
· 會話變量只有在更新表的語句中使用時才能正確複製;例如:SET MAX_JOIN_SIZE=1000;INSERT
INTO mytable VALUES(@MAX_JOIN_SIZE)不能將相同的數據插入到主服務器上和從服務器上。不適用於通用
的SET TIME_ZONE=...;INSERT INTO mytable VALUES(CONVERT_TZ(...,...,@time_zone))。
· 能夠將從服務器上的非事務表復爲主服務器上的事務表。例如,能夠將主服務器上的InnoDB表複製爲
從服務器上的MyISAM表。然而,複製過程當中,若是從服務器在BEGIN/COMMIT塊過程當中中止則會產生問題,
由於從服務器在BEGIN塊開始時會重啓。該問題出如今TODO中,不久將會獲得修復。
· 在MySQL 5.1中能夠正確複製引用用戶變量(即@var_name形式的變量)的更新語句;但在4.1之前的版
本中卻不可能。請注意從MySQL 5.1開始對用戶變量名的大小寫再也不敏感;當在5.1和舊版本之間設置複製時應
考慮該問題。
· 從服務器能夠使用SSL鏈接到主服務器。
· 有一個全局系統變量slave_transaction_retries:若是由於某個InnoDB死鎖或超過
InnoDB的innodb_lock_wait_timeout或NDB簇
的TransactionDeadlockDetectionTimeout或TransactionInactiveTimeout,REPLICATION SLAVESQL線程未能
執行某個事務,在給出錯誤中止前自動重試slave_transaction_retries次。默認值是10。從MySQL 5.0.4開始,
能夠從SHOW STATUS的輸出中看到重試總次數;參見5.3.4節,「服務器狀態變量」。
· 若是在主服務器上的CREATE TABLE語句中使用了DATA DIRECTORY或INDEX DIRECTORY子句,子句
也能夠在從服務器上使用。若是在從服務器主機文件系統中不存在一致的目錄或雖然存在但不能被從服務器訪
問,則會帶來問題。MySQL 5.1支持一個稱爲NO_DIR_IN_CREATE的sql_mode選項。若是從服務器運行時
將SQL模式設置爲包括該選項,複製CREATE TABLE語句時將忽略這些子句。結果是在表的數據庫目錄中建立
了MyISAM數據和索引文件。
· 下面的限制只適合基於語句的複製,而不是基於行的複製:若是在查詢中數據修改不肯定,主服務器和
從服務器上的數據能夠不一樣;也就是由查詢優化器肯定。(這是經常使用的但不是很好的習慣,即便不是在複製中
也很差)。關於該問題的詳細解釋,參見A.8.1節,「MySQL中的打開事宜」。

· 帶READ LOCK的FLUSH LOGS、FLUSH MASTER、FLUSH SLAVE和FLUSH TABLES不記入日誌,由於如
果複製到從服務器會形成問題。關於語法示例,參見13.5.5.2節,「FLUSH語法」。FLUSH TABLES、ANALYZE
TABLE、OPTIMIZE TABLE和REPAIR TABLE語句被寫入二進制日誌並會複製到從服務器。通常狀況不會形成問
題,由於這些語句不修改表的數據。可是在某些狀況下會帶來問題。若是你複製mysql數據庫中的受權表而且
不使用GRANT直接更新那些表,必須在從服務器上執行FLUSH PRIVILEGES使新的權限生效。而且,若是使
用FLUSH TABLES從新命名MERGE表的MyISAM表,必須手動在從服務器上執行FLUSH TABLES。若是不指
定NO_WRITE_TO_BINLOG或其別名LOCAL,則這些語句被寫入二進制日誌。
· MySQL只支持一個主服務器和多個從服務器。咱們計劃未來添加一個投票算法,當前的主服務器出現問
題時自動切換。咱們還計劃引入代理過程經過向不一樣的從服務器發送SELECT查詢以幫助進行負載均衡。
· 當服務器關閉、重啓時,其MEMORY表將變爲空。主服務器按下述方法複製該結果:啓動後第1次主服
務器使用每一個MEMORY表,它通知從服務器須要向表寫入DELETE FROM語句來清空二進制日誌的表。詳細信
息參見15.4節,「MEMORY (HEAP)存儲引擎」。
· 除了關閉從服務器(而不只僅是從服務器線程) 臨時表都被複制,而且尚未在從服務器上執行的更新
所使用的臨時表也已經複製。若是關閉從服務器,從服務器重啓後更新須要的那些臨時表不可再用。爲了不
該問題,臨時表打開時不要關閉從服務器。而應遵守下面的程序:
1. 執行STOP SLAVE語句。
2. 使用SHOW STATUS檢查slave_open_temp_tables變量的值。
3. 若是值爲0,使用mysqladmin shutdown命令關閉從服務器。
4. 若是值不爲0,用START SLAVE重啓從服務器線程。
5. 後面再重複該程序看下次的運氣是否好一些。
咱們計劃在不久的未來修復該問題。
· 能夠很安全地鏈接用--logs-slave-updates選項指定的循環主服務器/從服務器關係中的服務器。但請注
意許多語句在這種設置中不能正確工做,除非你的客戶代碼關注了潛在的在不一樣的服務器不一樣順序的更新中可
能發生的這類問題。
這說明你能夠象這樣建立設置:
A -> B -> C -> A
服務器ID被編碼在二進制日誌事件中,所以服務器A知道什麼時候本身首次建立它讀取的事件而且不執行事件(除非
用--replicate-same-server-id選項啓動了服務器A,只在不多狀況下有意義)。這樣,沒有無限循環。只有對錶
執行沒有衝突的更新時該類循環設置才能工做。換句話說,若是在A和C中插入數據,絕對不該在A中插入鍵值
可能與插入到C中的行相沖突的一行。若是更新的順序很重要,還不該更新兩個服務器上相同的行。
· 若是從服務器上的某個語句產生錯誤,則從服務器上的SQL線程終止,而且從服務器向錯誤日誌寫入一
條消息。此時應手動鏈接從服務器,修復該問題(例如,一個不存在的表),而後運行START SLAVE。
· 能夠很安全地關閉主服務器並在之後重啓。若是某個從服務器丟失與主服務器的鏈接,從服務器嘗試立
即從新鏈接。若是失敗,從服務器按期重試。(默認設置是每60秒重試一次。能夠經過--master-connectretry
選項更改)。從服務器也可以處理網絡鏈接中斷。可是,只有從服務器超過slave_net_timeout秒沒有從主
服務器收到數據才通知網絡中斷。若是中斷時間短,能夠下降slave_net_timeout。參見5.3.3節,「服務器系統
變量」。
· 關閉從服務器(淨關閉)也很安全,由於它能夠跟蹤它離開的地點。不純淨的關閉操做會產生問題,特
別是系統關閉前硬盤緩存未刷新到硬盤上時。若是有不間斷電源,能夠大大提升系統容錯能力。不純淨的關閉
主服務器會形成主服務器上的表和二進制日誌內容之間的不一致性;在主服務器上使用InnoDB表和--innodbChapter

safe-binlog選項能夠避免該問題。參見5.11.3節,「二進制日誌」。(註釋:MySQL 5.1中不須要--innodb-safebinlog,
因爲引入了XA事務支持已經做廢了)。
· 因爲MyISAM表的非事務屬性,能夠有一個語句只是更新一個表並返回錯誤代碼。例如,多行插入時有
一個行超過鍵值約束,或者若是長的更新語句更新部分行後被殺掉了。若是發生在主服務器上,除非錯誤代碼
合法而且語句執行產生相同的錯誤代碼,從服務器線程將退出並等待數據庫管理員決定如何作。若是該錯誤代
碼驗證行爲不理想,能夠用--slave-skip-errors選項掩蓋(忽視)部分或所有錯誤。
· 若是從BEGIN/COMMIT系列的非事務表更新事務表,若是提交事務前更新非事務表,對二進制日誌的更
新可能會不一樣步。這是由於事務提交後才被寫入二進制日誌。
· 事務混合更新事務表和非事務表時,二進制日誌中語句的順序是正確的,即便在ROLLBACK時,全部需
要的語句也會寫入二進制日誌。可是若是在第1個鏈接的事務完成前,第2個鏈接更新非事務表,語句記入日誌
時會出現順序錯誤,由於第2個鏈接的更新執行完後當即寫入日誌,而無論第1個鏈接執行的事務的狀態如何 
 * 
 * 
 * 
 * 
若是你的問題是與具體MySQL表達式或函數有關,能夠使用mysql客戶程序所帶的BENCHMARK()函數執行定
時測試。其語法爲BENCHMARK(loop_count,expression)。例如:
mysql> SELECT BENCHMARK(1000000,1+1);
+------------------------+
| BENCHMARK(1000000,1+1) |
+------------------------+
| 0 |
+------------------------+
1 row in set (0.32 sec)
上面結果在PentiumII 400MHz系統上得到。它顯示MySQL在該系統上在0.32秒內能夠執行1,000,000個簡單
的+表達式運算。
全部MySQL函數應該被高度優化,可是總有可能有一些例外。BENCHMARK()是一個找出是否查詢有問題的優
秀的工具
 * 
 * 
mysql> ANALYZE TABLE tt; 
 * 
 * 

 * 
 * 
 * 
鎖定方法
MySQL 5.1支持對MyISAM和MEMORY表進行表級鎖定,對BDB表進行頁級鎖定,對InnoDB表進行行級鎖定。
在許多狀況下,能夠根據培訓猜想應用程序使用哪類鎖定類型最好,但通常很難說出某個給出的鎖類型就比另
一個好。一切取決於應用程序,應用程序的不一樣部分可能須要不一樣的鎖類型。
爲了肯定是否想要使用行級鎖定的存儲引擎,應看看應用程序作什麼而且混合使用什麼樣的選擇和更新語句。
例如,大多數Web應用程序執行許多選擇,而不多進行刪除,只對關鍵字的值進行更新,而且只插入少許具體
的表。基本MySQL MyISAM設置已經調節得很好。
在MySQL中對於使用表級鎖定的存儲引擎,表鎖定時不會死鎖的。這經過老是在一個查詢開始時當即請求全部
必要的鎖定而且老是以一樣的順序鎖定表來管理。
對WRITE,MySQL使用的表鎖定方法原理以下:
若是在表上沒有鎖,在它上面放一個寫鎖。
不然,把鎖定請求放在寫鎖定隊列中。
對READ,MySQL使用的鎖定方法原理以下:
若是在表上沒有寫鎖定,把一個讀鎖定放在它上面。
不然,把鎖請求放在讀鎖定隊列中。
當一個鎖定被釋放時,鎖定可被寫鎖定隊列中的線程獲得,而後是讀鎖定隊列中的線程。
這意味着,若是你在一個表上有許多更新,SELECT語句將等待直到沒有更多的更新。
能夠經過檢查table_locks_waited和table_locks_immediate狀態變量來分析系統上的表鎖定爭奪:
mysql> SHOW STATUS LIKE 'Table%';
+-----------------------+---------+
| Variable_name | Value |
+-----------------------+---------+
| Table_locks_immediate | 1151552 |
| Table_locks_waited | 15324 |
+-----------------------+---------+
若是INSERT語句不衝突,能夠自由爲MyISAM表混合並行的INSERT和SELECT語句而不須要鎖定。也就是說,
你能夠在其它客戶正讀取MyISAM表的時候插入行。若是數據文件中間不包含空閒塊,不會發生衝突,由於在
這種狀況下,記錄老是插入在數據文件的尾部。(從表的中部刪除或更新的行可能致使空洞)。若是有空洞,
當全部空洞填入新的數據時,並行的插入可以從新自動啓用。
若是不能同時插入,爲了在一個表中進行屢次INSERT和SELECT操做,能夠在臨時表中插入行而且當即用臨時
表中的記錄更新真正的表。
這可用下列代碼作到:
mysql> LOCK TABLES real_table WRITE, insert_table WRITE;
mysql> INSERT INTO real_table SELECT * FROM insert_table;
mysql> TRUNCATE TABLE insert_table;
mysql> UNLOCK TABLES;
InnoDB使用行鎖定,BDB使用頁鎖定。對於這兩種存儲引擎,均可能存在死鎖。這是由於,在SQL語句處理期
間,InnoDB自動得到行鎖定和BDB得到頁鎖定,而不是在事務啓動時得到。
行級鎖定的優勢:
· 當在許多線程中訪問不一樣的行時只存在少許鎖定衝突。
· 回滾時只有少許的更改。
· 能夠長時間鎖定單一的行。
行級鎖定的缺點:
· 比頁級或表級鎖定佔用更多的內存。
· 當在表的大部分中使用時,比頁級或表級鎖定速度慢,由於你必須獲取更多的鎖。
· 若是你在大部分數據上常常進行GROUP BY操做或者必須常常掃描整個表,比其它鎖定明顯慢不少。
· 用高級別鎖定,經過支持不一樣的類型鎖定,你也能夠很容易地調節應用程序,由於其鎖成本小於行級鎖
定。
在如下狀況下,表鎖定優先於頁級或行級鎖定:
· 表的大部分語句用於讀取。
· 對嚴格的關鍵字進行讀取和更新,你能夠更新或刪除能夠用單一的讀取的關鍵字來提取的一行:
· UPDATE tbl_name SET column=value WHERE unique_key_col=key_value;
· DELETE FROM tbl_name WHERE unique_key_col=key_value;
· SELECT 結合並行的INSERT語句,而且只有不多的UPDATE或DELETE語句。

· 在整個表上有許多掃描或GROUP BY操做,沒有任何寫操做。
不一樣於行級或頁級鎖定的選項:
· 版本(例如,爲並行的插入在MySQL中使用的技術),其中能夠一個寫操做,同時有許多讀取操做。這說
明數據庫或表支持數據依賴的不一樣視圖,取決於訪問什麼時候開始。其它共同的術語是「時間跟蹤」、「寫複製」或
者「按需複製」。
· 按需複製在許多狀況下優先於頁級或行級鎖定。然而,在最壞的狀況下,它可能比使用常規鎖定使用更
多的內存。
· 除了行級鎖定外,你能夠使用應用程序級鎖定,例如在MySQL中使
用GET_LOCK()和RELEASE_LOCK()。這些是建議性鎖定,它們只能在運行良好的應用程序中工做。
 * 
 * 
 * 
 * 
 * 
MyISAM鍵高速緩衝

爲了使硬盤I/O最小化,MyISAM存儲引擎使用一個被許多數據庫管理系統使用的策略。它使用一個緩存機制將
常常訪問的表鎖在內存中:
Chapter 7. Optimization
file:///D:/download/refman-5.1-zh.html-chapter/refman-5.1-zh.html-chapter/optimization.html[2010/2/24 5:22:07]
· 對於索引塊,維護一個稱之爲鍵高速緩衝(或鍵高速緩衝區)的特殊結構。該結構包含大量塊緩存區,其
中放置了最經常使用的索引塊。
· 對於數據塊,MySQL不使用特殊緩存。而使用原生的操做系統文件系統的緩存。
本節首先描述了MyISAM鍵高速緩衝的基本操做。而後討論了提升鍵高速緩衝性能並使你更好地控制緩存操做
的最新的更改:
· 多個線程能夠並行訪問緩存。
· 能夠設置多個鍵高速緩衝,並將表索引指定給具體緩存。
能夠使用key_buffer_size系統變量控制鍵高速緩衝的大小。若是該變量設置爲零,不使用鍵高速緩衝。如
果key_buffer_size值過小不能分配最小數量的塊緩存區(8),也不使用鍵高速緩衝。
若是鍵高速緩衝不工做,只使用操做系統提供的原生文件系統緩存區訪問索引文件。(換句話說,使用與表數
據塊相同的策略表來訪問索引塊)。
索引塊是一個連續的訪問MyISAM索引文件的單位。一般一個索引塊的大小等於索引B-樹節點的大小。(在硬盤
上使用B-樹數據結構表示索引。樹底部的節點爲葉子節點。葉子節點上面的節點爲非葉子節點)。
鍵高速緩衝結構中的全部塊緩存區大小相同。該大小能夠等於、大於或小於表索引塊的大小。一般這兩個值中
的一個是另外一個的幾倍。
當必須訪問表索引塊中的數據時,服務器首先檢查是否它能夠用於鍵高速緩衝中的某些塊緩存區。若是適用,
服務器訪問鍵高速緩衝中的數據而不是硬盤上的數據。也就是說,從緩存讀取或寫入緩存,而不是從硬盤讀
寫。不然,服務器選擇一個包含一個不一樣的表索引塊的緩存塊緩存區,並用須要的表索引塊的拷貝替換那裏的
數據。一旦新的索引塊位於緩存中,能夠訪問索引數據。
若是用於替換的塊已經被修改了,塊被視爲「髒了」。在這種狀況下,在替換前,其內容被刷新到它來自的表索
引。
一般服務器聽從LRU(最近最少使用)策略:當選擇一個塊用於替換時,它選擇最近最少使用的索引塊。爲了使
該選擇更容易, 鍵高速緩衝模塊維護全部使用的塊的專門隊列(LRU鏈)。當訪問塊時,它被放到隊列最後。當
塊須要替換時,隊列開頭的塊是最近最少使用的塊,併成爲第1個候選者。
7.4.6.1. 共享鍵高速緩衝訪問
在如下條件下,線程能夠同時訪問鍵高速緩衝緩存區:
· 沒有被更新的緩存區能夠被多個線程訪問。
· 正被更新的緩存區讓須要使用它的線程等待直到更新完成。
· 多個線程能夠發起請求替換緩存塊,只要它們不彼此干擾(也就是說,只要它們須要不一樣的索引塊,並
且使不一樣的緩存塊被替換)。
對鍵高速緩衝的共享訪問容許服務器大大提升吞吐量。
7.4.6.2. 多鍵高速緩衝
對鍵高速緩衝的共享訪問能夠提升性能但不能徹底消除線程之間的竟爭。它們仍然競爭對鍵高速緩衝緩存區的
訪問進行管理的控制結構。爲了進一步下降鍵高速緩衝訪問竟爭,MySQL 5.1還提供了多個鍵高速緩衝,容許
你爲不一樣的鍵高速緩衝分配不一樣的表索引。

有多個鍵高速緩衝時,當爲給定的MyISAM表處理查詢時,服務器必須知道使用哪一個緩存。默認狀況,所
有MyISAM表索引被緩存到默認鍵高速緩衝中。要想爲具體鍵高速緩衝分配表索引,應使用CACHE INDEX語
句(參見13.5.5.1節,「CACHE INDEX語法」)。
例如,下面的語句將表t一、t2和t3的索引分配給名爲hot_cache的鍵高速緩衝:
mysql> CACHE INDEX t1, t2, t3 IN hot_cache;
+---------+--------------------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+---------+--------------------+----------+----------+
| test.t1 | assign_to_keycache | status | OK |
| test.t2 | assign_to_keycache | status | OK |
| test.t3 | assign_to_keycache | status | OK |
+---------+--------------------+----------+----------+
能夠用SET GLOBAL參數設置語句或使用服務器啓動選項設置在CACHE INDEX語句中引用的鍵高速緩衝的大小
來建立鍵高速緩衝。例如:
mysql> SET GLOBAL keycache1.key_buffer_size=128*1024;
要想刪除鍵高速緩衝,將其大小設置爲零:
mysql> SET GLOBAL keycache1.key_buffer_size=0;
請注意不能刪除默認鍵高速緩衝。刪除默認鍵高速緩衝的嘗試將被忽略:
mysql> set global key_buffer_size = 0;
mysql> show variables like 'key_buffer_size';
+-----------------+---------+
| Variable_name | Value |
+-----------------+---------+
| key_buffer_size | 8384512 |
+-----------------+---------+
鍵高速緩衝變量是結構式系統變量,有一個名和組件。對於keycache1.key_buffer_size,keycache1是緩存變
量名,key_buffer_size是緩存組件。關於引用結構式鍵高速緩衝系統變量所使用的語法的描述,參
見9.4.1節,「結構式系統變量」
默認狀況下,表索引被分配給服務器啓動時建立的主要(默認)鍵高速緩衝。當鍵高速緩衝被刪除後,全部分配
給它的索引被從新分配給默認鍵高速緩衝。
對於一個忙的服務器,咱們建議採用使用三個鍵高速緩衝的策略:
· 佔用爲全部鍵高速緩衝分配的空間的20%的「熱」鍵高速緩衝。該緩存用於頻繁用於搜索但沒有更新的
表。
· 佔用爲全部鍵高速緩衝分配的空間的20%的「冷」鍵高速緩衝。該緩存用於中等大小、大量修改的表,例

如臨時表。
· 佔用鍵高速緩衝空間的20%的「溫」鍵高速緩衝。使用它做爲默認鍵高速緩衝,默認狀況被全部其它表
使用。
使用3個鍵高速緩衝有好處的一個緣由是對一個鍵高速緩衝結構的訪問不會阻擋對其它的訪問。訪問分配給一
個緩存的表的查詢不會與訪問分配給其它緩存的表的查詢競爭。因爲其它緣由也會提升性能:
· 熱緩存只用於檢索查詢,所以其內容決不會被修改。結果是,不管什麼時候須要從硬盤上拉入索引塊,選擇
用於替換的緩存塊的內容不須要先刷新。
· 對於分配給熱緩存的索引,若是沒有查詢須要索引掃描,頗有可能對應索引B-樹的非葉子節點的索引塊
仍然在緩存中。
· 當更新的節點位於緩存中而且不須要先從硬盤讀入時,爲臨時表頻繁執行的更新操做會執行得更快。如
果臨時表的索引的大小能夠與冷鍵高速緩衝相比較,極可能更新的節點位於緩存中。
CACHE INDEX在一個表和鍵高速緩衝之間創建一種聯繫,但每次服務器重啓時該聯繫被丟失。若是你想要每
次服務器重啓時該聯繫生效,一個發辦法是使用選項文件:包括配置鍵高速緩衝的變量設定值,和一個initfile
選項用來命名包含待執行的CACHE INDEX語句的一個文件。例如:
key_buffer_size = 4G
hot_cache.key_buffer_size = 2G
cold_cache.key_buffer_size = 2G
init_file=/path/to/data-directory/mysqld_init.sql
每次服務器啓動時執行mysqld_init.sql中的語句。該文件每行應包含一個SQL語句。下面的例子分配幾個表,
分別對應hot_cache和cold_cache:
CACHE INDEX a.t1, a.t2, b.t3 IN hot_cache
CACHE INDEX a.t4, b.t5, b.t6 IN cold_cache
7.4.6.3. 中點插入策略
默認狀況,鍵高速緩衝管理系統採用LRU策略選擇要收回的鍵高速緩衝塊,但它也支持更復雜的方法,稱之
爲「中點插入策略」。
當使用中點插入策略時,LRU鏈被分爲兩個部分:一條熱子鏈和一條溫子鏈。兩部分之間的劃分點不固定,但
鍵高速緩衝管理系統關注溫部分不「過短」,老是包含至少key_cache_division_limit比例的鍵高速緩衝
塊。key_cache_division_limit是結構式鍵高速緩衝變量的一個組件,所以其值是一個能夠根據每一個緩存進行設
置的參數。
當一個索引塊從表中讀入鍵高速緩衝,它被放入溫子鏈的末端。通過必定量的訪問後(訪問塊),它被提高給熱
子鏈。目前,須要用來提高一個塊(3)的訪問次數與全部索引塊的相同。
提高到熱子鏈的塊被放到子鏈的末端。塊而後在該子鏈中循環。若是塊在子鏈的開頭停留足夠長的時間,它被
降到溫鏈。該時間由鍵高速緩衝key_cache_age_threshold組件的值肯定。
對於包含N個塊的鍵高速緩衝,閾值表示,熱子鏈開頭的沒有在最後N *key_cache_age_threshold/100次訪問
中被訪問的塊將被移動到溫子鏈開頭。該塊而後變爲第1個擠出的候選者,由於替換的塊老是來自溫子鏈的開
頭。
中點插入策略容許你將更有價值的塊老是在緩存中。若是你想使用簡單的LRU策略,
使key_cache_division_limit值保持其默認值100。

若執行的查詢要求索引掃描有效推出全部索引塊對應有數值的高級B-樹節點的緩存,中點插入策略能夠幫助提
高性能。要想避免,必須使用中點插入策略,而key_cache_division_limit設置爲遠小於100。而後在索引掃描
操做過程當中,有數值的常常訪問的節點被保留在熱子鏈中。
7.4.6.4. 索引預加載
若是鍵高速緩衝內有足夠的塊以容納整個索引的塊,或者至少容納對應其非葉節點的塊,則在使用前,預裝含
索引塊的鍵高速緩衝頗有意義。預裝能夠以更有效的方式將表索引塊放入鍵高速緩衝緩存區中:經過順序地從
硬盤讀取索引塊。
不進行預裝,塊仍然根據查詢須要放入鍵高速緩衝中。儘管塊將仍然在緩存中(由於有足夠的緩存區保存它
們),它們以隨機方式從硬盤上索取,而不是以順序方式。
要想將索引預裝到緩存中,使用LOAD INDEX INTO CACHE語句。例如,下面的語句能夠預裝表t1和t2索引的
節點(索引塊):
mysql> LOAD INDEX INTO CACHE t1, t2 IGNORE LEAVES;
+---------+--------------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+---------+--------------+----------+----------+
| test.t1 | preload_keys | status | OK |
| test.t2 | preload_keys | status | OK |
+---------+--------------+----------+----------+
IGNORE LEAVES修改器只容許預裝索引非葉節點所用的塊。這樣,上述的語句預裝t1中的全部索引塊,但只預
裝t2中的非葉節點對應的塊。
若是已經使用CACHE INDEX語句爲一個索引分配了一個鍵高速緩衝,預裝能夠將索引塊放入該緩存。不然,索
引被裝入默認鍵高速緩衝。
7.4.6.5. 鍵高速緩衝塊大小
能夠使用key_cache_block_size變量爲具體的鍵高速緩衝指定塊緩存區的大小。這樣容許爲索引文件調
節I/O操做的性能。
當讀緩存區的大小等於原生操做系統I/O緩存區的大小時,能夠得到I/O操做的最佳性能。可是將關鍵字節點的
大小設置爲等於I/O緩存區的大小並不老是能保證最佳總體性能。當讀取大的葉節點時,服務器讀入大量的不
須要的數據,結果防止讀入其它葉子的節點。
目前,你不能控制表內索引塊的大小。該大小由服務器在建立.MYI索引文件時設置,取決於表定義中索引的關
鍵字大小。在大多數狀況下,它被設置爲與I/O緩存區大小相等。
7.4.6.6. 重構鍵高速緩衝
鍵高速緩衝能夠經過更新其參數值隨時從新構建。例如:
mysql> SET GLOBAL cold_cache。key_buffer_size=4*1024*1024;
若是你爲key_buffer_size或key_cache_block_size鍵高速緩衝組件分配的值與組件當前的值不一樣,服務器將毀
掉緩存的舊結構並根據新值建立一個新的。若是緩存包含任何髒的塊,服務器在銷燬前將它們保存到硬盤上並
從新建立緩存。若是你設置其它鍵高速緩衝參數,則不會發生從新構建。

當從新構建鍵高速緩衝時,服務器首先將任何髒緩存區的內容刷新到硬盤上。以後,緩存內容再也不須要。然
而,從新構建並不阻塞須要使用分配給緩存的索引的查詢。相反,服務器使用原生文件系統緩存直接訪問表索
引。文件系統緩存不如使用鍵高速緩衝有效,所以儘管查詢能夠執行,但速度會減慢。緩存被從新構建後,它
又能夠緩存分配給它的索引了,而且索引再也不使用文件系統緩存。 
 * 
 * 
 * 
MySQL如何計算打開的表
當運行mysqladmin status時,將看見象這樣的一些東西:
Uptime: 426 Running threads: 1 Questions: 11082
Reloads: 1 Open tables: 12
若是你僅有6個表,Open tables值爲12可能有點使人困惑。
MySQL是多線程的,所以許多客戶能夠同時在同一個表上進行查詢。爲了使多個客戶線程在同一個表上有不
同狀態的問題減到最小,表被每一個併發進程獨立地打開。這樣須要額外的內存但通常會提升性能。對
於MyISAM表,數據文件須要爲每一個打開表的客戶提供一個額外的文件描述符。(索引文件描述符在全部線程之
間共享)。
 * 
 * 
 * 
MySQL如何使用DNS
當新的客戶鏈接mysqld時,mysqld建立一個新的線程來處理請求。該線程先檢查是否主機名在主機名緩存
中。若是不在,線程試圖解析主機名:

· 若是操做系統支持線程安全gethostbyaddr_r ()和gethostbyname_r()調用,線程使用它們來執行主機名
解析。
· 若是操做系統不支持線程安全調用,線程鎖定一個互斥體並調用gethostbyaddr()和gethostbyname()。
在這種狀況下,在第1個線程解鎖互斥體前,沒有其它線程能夠解析不在主機名緩存中的主機名。
你能夠用--skip-name-resolve選項啓動mysqld來禁用DNS主機名查找。然而,在這種狀況下,你只能夠使
用MySQL中的受權表中的IP號。
若是你有一個很慢的DNS和許多主機,你能夠經過用--skip-name-resolve禁用DNS查找或增
加HOST_CACHE_SIZE定義(默認值:128)並從新編譯mysqld來提升性能。
你能夠用--skip-host-cache選項啓動服務器來禁用主機名緩存。要想清除主機名緩存,執行FLUSH HOSTS語句
或執行mysqladmin flush-hosts命令。
若是你想要徹底禁止TCP/IP鏈接,用--skip-networking選項啓動mysqld。
 * 
 * 
 * 
 * 
 * 
磁盤事宜
7.6.1. 使用符號連接
· 磁盤搜索是巨大的性能瓶頸。當數據量變得很是大以至於緩存性能變得不可能有效時,該問題變
得更加明顯。對於大數據庫,其中你或多或少地隨機訪問數據,你能夠確信對讀取操做須要至少一次硬
盤搜索,寫操做須要屢次硬盤搜索。要想使該問題最小化,應使用搜索次數較少的磁盤。
· 經過連接文件到不一樣的磁盤或對硬盤分段來增長可用磁盤錠數量(所以下降搜索成本):
o 使用符號連接
這說明,對於MyISAM表,你符號連接索引文件和/或數據文件,從它們數據目錄內的一般位置到另外一個
硬盤(也能夠被條紋化)。這將使搜索和讀次數達到最好,假定硬盤再也不爲其它目的使用。參
見7.6.1節,「使用符號連接」。
o 分條
分條意味着你有許多磁盤,將第1個塊放到第1個硬盤,第2個塊放到第2個磁盤,而且第N塊在(N mod
number_of_disks)磁盤上等等。這意味着若是正常數據大小小於分條大小(或徹底匹配),可以獲得最
佳性能。分條徹底取決於操做系統和分條大小,所以用不一樣的條紋大小對應用程序進行基準測試。參
見7.1.5節,「使用本身的基準」。
分條的不一樣速度徹底依賴於參數。依賴於怎樣設置條紋參數和硬盤數量,能夠根據不一樣數量級別獲得不
同的標準。你必須進行選擇以便優化隨機或順序存取。
· 爲了高可靠性你可能想使用RAID 0+1(條紋加鏡像),但在這種狀況下,須要2*N塊磁盤來保
持N個磁盤的數據。若是你肯爲它花錢,這多是最好的選項。然而,你可能還必須投資一部分資金到卷
管理軟件中以便有效地管理它。
· 一個較好的選擇是根據數據類型的重要性程度改變RAID級別。例如,保存能夠在RAID 0硬盤上重
新生成的不過重要的數據,但保存真正重要數據(例如主機信息和日誌)到RAID 0+1或RAID N硬盤。
若是你有許多寫操做,RAID N可能會存在問題,由於須要時間來更新校驗位。
· 在Linux上,經過配置磁盤接口時使用hdparm,你能夠得到更多的性能。(在通常負載下達
到100%並不困難。)下面的hdparm選項應該很是適用於MySQL,而且可能適用於許多其它應用程序:
hdparm -m 16 -d 1

請注意,當使用該命令時,性能和可靠性依賴於硬件,所以咱們強烈建議,使用hdparm後,徹底測試你
的系統。爲獲取更多詳細信息,請查閱hdparm手冊幫助頁。若是hdparm使用的很差,會致使文件系統
破壞,所以試驗以前請作好每一個備份!
· 也能夠設置數據庫使用的文件系統參數:
若是不須要知道文件最後一次訪問的時間(這對數據庫服務器並無實際的用途),能夠用-o noatime選
項安裝文件系統。這將跳過對文件系統中的節點的最後一次訪問時間的更新,從而可以避免一些硬盤搜
索。
在許多操做系統中,用-o async選項安裝,能夠將文件系統設置爲異步更新。若是電腦至關穩定,這應該
給予你更高的性能而不須要犧牲太多的可靠性。(該標誌是Linux中默認開啓。)
 * 
 * 
 * 
客戶端腳本和實用工具概述
下面簡單列出了MySQL客戶端程序和實用工具:
· myisampack
壓縮MyISAM表以產生更小的只讀表的一個工具。參見8.2節,「myisampack:生成壓縮、只讀MyISAM表」。
· mysql
交互式輸入SQL語句或從文件以批處理模式執行它們的命令行工具。參見8.3節,「mysql:MySQL命令行工具」。
· mysqlaccess
檢查訪問主機名、用戶名和數據庫組合的權限的腳本。
· mysqladmin
執行管理操做的客戶程序,例如建立或刪除數據庫,重載受權表,將表刷新到硬盤上,以及從新打開日誌文
件。mysqladmin還能夠用來檢索版本、進程,以及服務器的狀態信息。參見8.5節,「mysqladmin:用於管
理MySQL服務器的客戶端」。

· mysqlbinlog
從二進制日誌讀取語句的工具。在二進制日誌文件中包含的執行過的語句的日誌可用來幫助從崩潰中恢復。參
見8.6節,「mysqlbinlog:用於處理二進制日誌文件的實用工具」。
· mysqlcheck
檢查、修復、分析以及優化表的表維護客戶程序。參見8.7節,「mysqlcheck:表維護和維修程序」。
· mysqldump
將MySQL數據庫轉儲到一個文件(例如SQL語句或tab分隔符文本文件)的客戶程序。加強版免費軟件首先
由Igor Romanenko提供。參見8.8節,「mysqldump:數據庫備份程序」。
· mysqlhotcopy
當服務器在運行時,快速備份MyISAM或ISAM表的工具。參見8.9節,「mysqlhotcopy:數據庫備份程序」。
· mysql import
使用LOAD DATA INFILE將文本文件導入相關表的客戶程序。參見8.10節,「mysqlimport:數據導入程序」。
· mysqlshow
顯示數據庫、表、列以及索引相關信息的客戶程序。參見8.11節,「mysqlshow:顯示數據庫、表和列信息」。
· perror
顯示系統或MySQL錯誤代碼含義的工具。參見8.13節,「perror:解釋錯誤代碼」。
· replace
更改文件中或標準輸入中的字符串的實用工具。參見8.14節,「replace:字符串替換實用工具」。
MySQL AB還提供了大量GUI工具用於管理和MySQL服務器的其它工做。相關基本信息參見第4章:MySQL程序
概述。
每一個MySQL程序有許多不一樣的選項。但每一個MySQL程序均提供一個---help選項,能夠用來全面描述程序不一樣的
選項。例如,能夠試試mysql---help。
使用mysqlclient庫同服務器進行通信的MySQL客戶使用下面的環境變量:
MYSQL_UNIX_PORT 默認Unix套接字文件;用於鏈接localhost
MYSQL_TCP_PORT 默認端口號;用於TCP/IP鏈接
MYSQL_PWD 默認密碼
MYSQL_DEBUG 調試過程當中的調試跟蹤選項
TMPDIR 建立臨時表和文件的目錄
使用MYSQL_PWD不安全。參見5.8.6節,「使你的密碼安全」。
能夠在選項文件中或在命令行中指定選項來替換全部標準程序的默認選項值或指定的環境變量的值
 * 
 * 
 * 
 * 
 * 
 * 
mysql技巧
8.3.4.1. 垂直顯示查詢結果
一些查詢結果若是垂直顯示而不用一般的水平表格式顯示,則更容易讀取。用\G而不用分號結束查詢能夠垂直
顯示查詢。例如,包括新行的更長的文本值垂直輸出時一般更容易讀取:
mysql> SELECT * FROM mails WHERE LENGTH(txt) < 300 LIMIT 300,1\G
*************************** 1. row ***************************
msg_nro: 3068
date: 2000-03-01 23:29:50
time_zone: +0200
mail_from: Monty
reply: monty@no.spam.com
mail_to: "Thimble Smith" <tim@no.spam.com>
sbj: UTF-8
Chapter 8. Client and Utility Programs
file:///D:/download/refman-5.1-zh.html-chapter/refman-5.1-zh.html-chapter/client-side-scripts.html[2010/2/24 5:22:14]
txt: >>>>> "Thimble" == Thimble Smith writes:
Thimble> Hi. I think this is a good idea. Is anyone familiar
Thimble> with UTF-8 or Unicode? Otherwise, I'll put this on my
Thimble> TODO list and see what happens.
Yes, please do that.
Regards,
Monty
file: inbox-jani-1
hash: 190402944
1 row in set (0.09 sec)
8.3.4.2. 使用--safe-updates選項
對於新手,有一個有用的啓動選項--safe-updates(或--i-am-a-dummy,具備相同的效果)。當你已經發出一
個DELETE FROM tbl_name語句但忘記了WHERE子句時頗有用。一般狀況,這樣的語句從表中刪除全部行。用-
-safe-updates,能夠經過指定能夠識別它們的鍵值只刪除某些行。這樣能夠幫助防止事故。
若使用--safe-updates選項,mysql鏈接MySQL服務器時發出下面的語句:
SET SQL_SAFE_UPDATES=1,SQL_SELECT_LIMIT=1000, SQL_MAX_JOIN_SIZE=1000000;
參見13.5.3節,「SET語法」。
SET語句有下面的效果:
· 不容許你執行UPDATE或DELETE語句,除非在WHERE子句中指定一個鍵值約束或提供一個LIMIT子
句(或兩者皆使用)。例如:
· UPDATE tbl_name SET not_key_column=val WHERE key_column=val;
·
· UPDATE tbl_name SET not_key_column=val LIMIT 1;
· 全部大的SELECT結果自動限制到1,000行,除非語句包括一個LIMIT子句。
· 放棄可能須要檢查1,000,000多行組合的多表SELECT語句。
要將限制指定爲1,000和1,000,000以外的值,能夠使用--select_limit和--max_join_size選項覆蓋默認值:
shell> mysql --safe-updates --select_limit=500 --max_join_size=10000
8.3.4.3. 禁用mysql自動鏈接
若是mysql客戶程序發送查詢時斷開與服務器的鏈接,它當即並自動嘗試從新鏈接服務器並再次發送查詢。然
而,即便mysql從新鏈接成功,你的第1個鏈接也已經結束,而且之前的會話對象和設定值被丟失:包括臨時
表、自動提交模式,以及用戶和會話變量。該行爲很危險,以下面的例子所示,服務器將在你不知道的狀況下
關閉並重啓:
mysql> SET @a=1;
Query OK, 0 rows affected (0.05 sec)
mysql> INSERT INTO t VALUES(@a);
ERROR 2006: MySQL server has gone away
No connection. Trying to reconnect...

Connection id: 1
Current database: test
Query OK, 1 row affected (1.30 sec)
mysql> SELECT * FROM t;
+------+
| a |
+------+
| NULL |
+------+
1 row in set (0.05 sec)
@a用戶變量已經隨鏈接丟失,而且從新鏈接後它也沒有定義。若是有必要在鏈接斷開時終止mysql並提示錯
誤,你能夠用--skip-reconnect選項啓動mysql客戶程序
 * 
 * 
mysql_zap:殺死符合某一模式的進程
mysql_zap殺死匹配某一模式的進程。象這樣調用它:
shell> mysql_zap [-signal] [-?Ift] pattern
若是進程的ps命令的輸出行包含該模式,則認爲其匹配。默認狀況,mysql_zap對每一個進程請求確認。響
應y則殺死該進程,或者q退出mysql_zap。對於其它響應,mysql_zap不試圖殺死進程。
若是給出-signal選項,它指定發送到每一個進程的信號名或信號編號。不然,mysql_zap首先嚐試TERM(信
號15)而後用KILL(信號9)。
mysql_zap理解下面的額外選項:
· ---help,-?,-I
顯示一條幫助消息並退出。

· -f
強制模式。mysql_zap 視圖殺死每一個匹配的進程而不須要確認。
· -t
測試模式。顯示每一個進程的信息但不殺死它。 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 在MySQL中,下表中的字顯式被保留。其中大多數字進制被標準SQL用做列名和/或表名(例如,GROUP)。少
數被保留了,由於MySQL須要它們,(目前)使用yacc解析程序。保留字被引發來後能夠用做識別符。
ADD ALL ALTER
ANALYZE AND AS
ASC ASENSITIVE BEFORE
BETWEEN BIGINT BINARY
BLOB BOTH BY
CALL CASCADE CASE
CHANGE CHAR CHARACTER
CHECK COLLATE COLUMN
CONDITION CONNECTION CONSTRAINT
CONTINUE CONVERT CREATE
CROSS CURRENT_DATE CURRENT_TIME
CURRENT_TIMESTAMP CURRENT_USER CURSOR
DATABASE DATABASES DAY_HOUR
DAY_MICROSECOND DAY_MINUTE DAY_SECOND
DEC DECIMAL DECLARE
DEFAULT DELAYED DELETE
DESC DESCRIBE DETERMINISTIC
DISTINCT DISTINCTROW DIV
DOUBLE DROP DUAL
EACH ELSE ELSEIF
ENCLOSED ESCAPED EXISTS
EXIT EXPLAIN FALSE
FETCH FLOAT FLOAT4
FLOAT8 FOR FORCE
FOREIGN FROM FULLTEXT
GOTO GRANT GROUP
HAVING HIGH_PRIORITY HOUR_MICROSECOND
HOUR_MINUTE HOUR_SECOND IF
IGNORE IN INDEX
INFILE INNER INOUT
Chapter 9. Language Structure
file:///D:/download/refman-5.1-zh.html-chapter/refman-5.1-zh.html-chapter/language-structure.html[2010/2/24 5:22:18]
INSENSITIVE INSERT INT
INT1 INT2 INT3
INT4 INT8 INTEGER
INTERVAL INTO IS
ITERATE JOIN KEY
KEYS KILL LABEL
LEADING LEAVE LEFT
LIKE LIMIT LINEAR
LINES LOAD LOCALTIME
LOCALTIMESTAMP LOCK LONG
LONGBLOB LONGTEXT LOOP
LOW_PRIORITY MATCH MEDIUMBLOB
MEDIUMINT MEDIUMTEXT MIDDLEINT
MINUTE_MICROSECOND MINUTE_SECOND MOD
MODIFIES NATURAL NOT
NO_WRITE_TO_BINLOG NULL NUMERIC
ON OPTIMIZE OPTION
OPTIONALLY OR ORDER
OUT OUTER OUTFILE
PRECISION PRIMARY PROCEDURE
PURGE RAID0 RANGE
READ READS REAL
REFERENCES REGEXP RELEASE
RENAME REPEAT REPLACE
REQUIRE RESTRICT RETURN
REVOKE RIGHT RLIKE
SCHEMA SCHEMAS SECOND_MICROSECOND
SELECT SENSITIVE SEPARATOR
SET SHOW SMALLINT
SPATIAL SPECIFIC SQL
SQLEXCEPTION SQLSTATE SQLWARNING
SQL_BIG_RESULT SQL_CALC_FOUND_ROWS SQL_SMALL_RESULT
SSL STARTING STRAIGHT_JOIN
TABLE TERMINATED THEN
TINYBLOB TINYINT TINYTEXT
TO TRAILING TRIGGER
TRUE UNDO UNION
UNIQUE UNLOCK UNSIGNED
UPDATE USAGE USE
USING UTC_DATE UTC_TIME
UTC_TIMESTAMP VALUES VARBINARY
VARCHAR VARCHARACTER VARYING
Chapter 9. Language Structure
file:///D:/download/refman-5.1-zh.html-chapter/refman-5.1-zh.html-chapter/language-structure.html[2010/2/24 5:22:18]
WHEN WHERE WHILE
WITH WRITE X509
XOR YEAR_MONTH ZEROFILL
MySQL容許部分關鍵字用作未引發來的識別符,由於許多人之前曾使用過它們。下面列出了一些例子:
ACTION
BIT
DATE
ENUM
NO
TEXT
TIME
TIMESTAMP
 * 
 * 
 * 
 * 
  
 * 
 * 
 * 
 * mysql內置函數
 * 時間類型字段
mysql> select YEAR('2013-08-11');
+--------------------+
| YEAR('2013-08-11') |
+--------------------+
|               2013 |
+--------------------+
注意時間戳不行
 * 
 * 
 * mysql> select month('2013-08-11');
+---------------------+
| month('2013-08-11') |
+---------------------+
|                   8 |
+---------------------+
1 row in set (0.00 sec)
 * 
 * 
 * mysql> select day('2013-08-11');
+-------------------+
| day('2013-08-11') |
+-------------------+
|                11 |
+-------------------+
 * 
 * 從最右邊取5個長度
 * mysql> select right('2015-05-15',5);
+-----------------------+
| right('2015-05-15',5) |
+-----------------------+
| 05-15                 |
+-----------------------+
 * 
 * 
 * 
 * 從最左邊取4個長度
 * mysql> select left('2015-05-15',4);
+----------------------+
| left('2015-05-15',4) |
+----------------------+
| 2015                 |
+----------------------+
 * 
 * 
 
相關文章
相關標籤/搜索