1. Mysql中如何查看慢查詢以及查看線程
1,slow_query_log
這個參數設置為ON,可以捕獲執行時間超過一定數值的SQL語句。
2,long_query_time
當SQL語句執行時間超過此數值時,就會被記錄到日誌中,建議設置為1或者更短。
3,slow_query_log_file
記錄日誌的文件名。
4,log_queries_not_using_indexes
這個參數設置為ON,可以捕獲到所有未使用索引的SQL語句,盡管這個SQL語句有可能執行得挺快。
二、檢測mysql中sql語句的效率的方法
1、通過查詢日誌
(1)、Windows下開啟MySQL慢查詢
MySQL在Windows系統中的配置文件一般是是my.ini找到[mysqld]下面加上
代碼如下
log-slow-queries = F:/MySQL/log/mysqlslowquery。log
long_query_time = 2
(2)、Linux下啟用MySQL慢查詢
MySQL在Windows系統中的配置文件一般是是my.cnf找到[mysqld]下面加上
代碼如下
log-slow-queries=/data/mysqldata/slowquery。log
long_query_time=2
說明
log-slow-queries = F:/MySQL/log/mysqlslowquery。
為慢查詢日誌存放的位置,一般這個目錄要有MySQL的運行帳號的可寫許可權,一般都將這個目錄設置為MySQL的數據存放目錄;
long_query_time=2中的2表示查詢超過兩秒才記錄;
2.show processlist 命令
SHOW PROCESSLIST顯示哪些線程正在運行。您也可以使用mysqladmin processlist語句得到此信息。
各列的含義和用途:
ID列
一個標識,你要kill一個語句的時候很有用,用命令殺掉此查詢 /*/mysqladmin kill 進程號。
user列
顯示單前用戶,如果不是root,這個命令就只顯示你許可權范圍內的sql語句。
host列
顯示這個語句是從哪個ip的哪個埠上發出的。用於追蹤出問題語句的用戶。
db列
顯示這個進程目前連接的是哪個資料庫。
command列
顯示當前連接的執行的命令,一般就是休眠(sleep),查詢(query),連接(connect)。
time列
此這個狀態持續的時間,單位是秒。
state列
顯示使用當前連接的sql語句的狀態,很重要的列,後續會有所有的狀態的描述,請注意,state只是語句執行中的某一個狀態,一個
sql語句,以查詢為例,可能需要經過ing to tmp table,Sorting result,Sending
data等狀態才可以完成
info列
顯示這個sql語句,因為長度有限,所以長的sql語句就顯示不全,但是一個判斷問題語句的重要依據。
這個命令中最關鍵的就是state列,mysql列出的狀態主要有以下幾種:
Checking table
正在檢查數據表(這是自動的)。
Closing tables
正在將表中修改的數據刷新到磁碟中,同時正在關閉已經用完的表。這是一個很快的操作,如果不是這樣的話,就應該確認磁碟空間是否已經滿了或者磁碟是否正處於重負中。
Connect Out
復制從伺服器正在連接主伺服器。
Copying to tmp table on disk
由於臨時結果集大於tmp_table_size,正在將臨時表從內存存儲轉為磁碟存儲以此節省內存。
Creating tmp table
正在創建臨時表以存放部分查詢結果。
deleting from main table
伺服器正在執行多表刪除中的第一部分,剛刪除第一個表。
deleting from reference tables
伺服器正在執行多表刪除中的第二部分,正在刪除其他表的記錄。
Flushing tables
正在執行FLUSH TABLES,等待其他線程關閉數據表。
Killed
發送了一個kill請求給某線程,那麼這個線程將會檢查kill標志位,同時會放棄下一個kill請求。MySQL會在每次的主循環中檢查kill標志
位,不過有些情況下該線程可能會過一小段才能死掉。如果該線程程被其他線程鎖住了,那麼kill請求會在鎖釋放時馬上生效。
Locked
被其他查詢鎖住了。
Sending data
正在處理SELECT查詢的記錄,同時正在把結果發送給客戶端。
Sorting for group
正在為GROUP BY做排序。
Sorting for order
正在為ORDER BY做排序。
Opening tables
這個過程應該會很快,除非受到其他因素的干擾。例如,在執ALTER TABLE或LOCK TABLE語句行完以前,數據表無法被其他線程打開。正嘗試打開一個表。
Removing plicates
正在執行一個SELECT DISTINCT方式的查詢,但是MySQL無法在前一個階段優化掉那些重復的記錄。因此,MySQL需要再次去掉重復的記錄,然後再把結果發送給客戶端。
Reopen table
獲得了對一個表的鎖,但是必須在表結構修改之後才能獲得這個鎖。已經釋放鎖,關閉數據表,正嘗試重新打開數據表。
Repair by sorting
修復指令正在排序以創建索引。
Repair with keycache
修復指令正在利用索引緩存一個一個地創建新索引。它會比Repair by sorting慢些。
Searching rows for update
正在講符合條件的記錄找出來以備更新。它必須在UPDATE要修改相關的記錄之前就完成了。
Sleeping
正在等待客戶端發送新請求.
System lock
正在等待取得一個外部的系統鎖。如果當前沒有運行多個mysqld伺服器同時請求同一個表,那麼可以通過增加--skip-external-locking參數來禁止外部系統鎖。
Upgrading lock
INSERT DELAYED正在嘗試取得一個鎖表以插入新記錄。
Updating
正在搜索匹配的記錄,並且修改它們。
User Lock
正在等待GET_LOCK()。
Waiting for tables
該線程得到通知,數據表結構已經被修改了,需要重新打開數據表以取得新的結構。然後,為了能的重新打開數據表,必須等到所有其他線程關閉這個表。以下幾
種情況下會產生這個通知:FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR
TABLE, ANALYZE TABLE,或OPTIMIZE TABLE。
waiting for handler insert
INSERT DELAYED已經處理完了所有待處理的插入操作,正在等待新的請求。
大部分狀態對應很快的操作,只要有一個線程保持同一個狀態好幾秒鍾,那麼可能是有問題發生了,需要檢查一下。
還有其他的狀態沒在上面中列出來,不過它們大部分只是在查看伺服器是否有存在錯誤是才用得著。
2. 怎麼啟動mysql服務
1、首先,我們需要修改mysql的配置文件,一般文件存放在/etc下面,文件名為my.cnf。
3. mysql幾個常見問題匯總
一、Can』t connect to MySQL server on 『localhost』 (10061)
翻譯:不能連接到 localhost 上的mysql
分析:這說明「localhost」計算機是存在的,但在這台機器上卻沒提供MySQL服務。
需要啟動這台機器上的MySQL服務,如果機子負載太高沒空相應請求也會產生這個錯誤。
解決:既然沒有啟動那就去啟動這台機子的mysql。如果啟動不成功,多數是因為你的my.ini配置的有問題。重新配置其即可。
如果覺得mysql負載異常,可以到mysql/bin 的目錄下執行mysqladmin -uroot -p123 processlist來查看mysql當前的進程。
二、Unknown MySQL Server Host 『localhosadst』 (11001)
翻譯:未知的MySQL伺服器 localhosadst
分析:伺服器 localhosasdst 不存在。或者根本無法連接
解決:仔細檢查自己論壇下面的 ./config.inc.php 找到$dbhost重新設置為正確的mysql 伺服器地址。
三、Access denied for user: 『roota@localhost』 (Using password: YES)
翻譯:用戶 roota 訪問 localhost 被拒絕(沒有允許通過)
分析:造成這個錯誤一般資料庫用戶名和密碼相對mysql伺服器不正確
解決:仔細檢查自己論壇下面的 ./config.inc.php 找到$dbuser、$dbpw核實後重新設置保存即可。
四、Access denied for user: 『red@localhost』 to database 『newbbs』
翻譯:用戶 red 在localhost 伺服器上沒有許可權操作資料庫newbbs
分析:這個提示和問題三是不同的。那個是在連接資料庫的時候就被阻止了,而這個錯誤是在對資料庫進行操作時引起的。比如在select update等等。這個是因為該用戶沒有操作資料庫相應的權力。比如select 這個操作在mysql.user.Select_priv里記錄 Y 可以操作N 不可以操作。
解決:如果是自己的獨立主機那麼更新mysql.user 的相應用戶記錄,比如這里要更新的用戶為red 。或者直接修改 ./config.inc.php 為其配置一個具有對資料庫操作許可權的用戶
或者通過如下的命令來更新授權grant all privileges on dbname.* to 『user』@』localhost』 identified by 『password』
提示:更新了mysql庫中的記錄一定要重啟mysql伺服器才能使更新生效
FLUSH PRIVILEGES;
五、No Database Selected
翻譯:沒有資料庫被選擇上
分析:產生的原因有兩種
config.inc.php 裡面$dbname設置的不對。致使資料庫根本不存在,所以在 $db->select_db($dbname); 時返回了false
和上面問題四是一樣的,資料庫用戶沒有select許可權,同樣會導致這樣的錯誤。當你發現config.inc.php的設置沒有任何問題,但還是提示這個錯誤,那一定就是這種情況了。
解決:對症下葯
打開config.inc.php 找到$dbname核實重新配置並保存
同問題四的解決方法
六、Can』t open file: 『xxx_forums.MYI』. (errno: 145)
翻譯:不能打開xxx_forums.MYI
問題分析:
這種情況是不能打開 cdb_forums.MYI 造成的,引起這種情況可能的原因有:
1、伺服器非正常關機,資料庫所在空間已滿,或一些其它未知的原因,對資料庫表造成了損壞。
2、類 unix 操作系統下直接將資料庫文件拷貝移動會因為文件的屬組問題而產生這個錯誤。
解決方法:
1、修復數據表
可以使用下面的兩種方式修復數據表:(第一種方法僅適合獨立主機用戶)
1)使用 myisamchk ,MySQL 自帶了專門用戶數據表檢查和修復的工具 —— myisamchk 。更改當前目錄到 MySQL/bin 下面,一般情況下只有在這個下面才能運行 myisamchk 命令。常用的修復命令為:myisamchk -r 數據文件目錄/數據表名.MYI;
2)通過 phpMyAdmin 修復, phpMyAdmin 帶有修復數據表的功能,進入到某一個表中後,點擊「操作」,在下方的「表維護」中點擊「修復表」即可。
注意:以上兩種修復方式在執行前一定要備份資料庫。
4. MySQL中如何查看「慢查詢」,如何分析執行SQL的效率
一、MySQL資料庫有幾個配置選項可以幫助我們及時捕獲低效SQL語句x0dx0ax0dx0a1,slow_query_logx0dx0a這個參數設置為ON,可以捕獲執行時間超過一定數值的SQL語句。x0dx0ax0dx0a2,long_query_timex0dx0a當SQL語句執行時間超過此數值時,就會被記錄到日誌中,建議設置為1或者更短。x0dx0ax0dx0a3,slow_query_log_filex0dx0a記錄日誌的文件名。x0dx0ax0dx0a4,log_queries_not_using_indexesx0dx0a這個參數設置為ON,可以捕獲到所有未使用索引的SQL語句,盡管這個SQL語句有可能執行得挺快。x0dx0ax0dx0a二、檢測mysql中sql語句的效率的方法x0dx0ax0dx0a1、通過查詢日誌x0dx0a(1)、Windows下開啟MySQL慢查詢x0dx0aMySQL在Windows系統中的配置文件一般是是my.ini找到[mysqld]下面加上x0dx0a代碼如下x0dx0alog-slow-queries = F:/MySQL/log/mysqlslowquery。logx0dx0along_query_time = 2x0dx0ax0dx0a(2)、Linux下啟用MySQL慢查詢x0dx0aMySQL在Windows系統中的配置文件一般是是my.cnf找到[mysqld]下面加上x0dx0a代碼如下x0dx0alog-slow-queries=/data/mysqldata/slowquery。logx0dx0along_query_time=2x0dx0a說明x0dx0alog-slow-queries = F:/MySQL/log/mysqlslowquery。x0dx0a為慢查詢日誌存放的位置,一般這個目錄要有MySQL的運行帳號的可寫許可權,一般都將這個目錄設置為MySQL的數據存放目錄;x0dx0along_query_time=2中的2表示查詢超過兩秒才記錄;x0dx0ax0dx0a2.show processlist 命令x0dx0ax0dx0aSHOW PROCESSLIST顯示哪些線程正在運行。您也可以使用mysqladmin processlist語句得到此信息。x0dx0a各列的含義和用途:x0dx0aID列x0dx0a一個標識,你要kill一個語句的時候很有用,用命令殺掉此查詢 /*/mysqladmin kill 進程號。x0dx0auser列x0dx0a顯示單前用戶,如果不是root,這個命令就只顯示你許可權范圍內的sql語句。x0dx0ahost列x0dx0a顯示這個語句是從哪個ip的哪個埠上發出的。用於追蹤出問題語句的用戶。x0dx0adb列x0dx0a顯示這個進程目前連接的是哪個資料庫。x0dx0acommand列x0dx0a顯示當前連接的執行的命令,一般就是休眠(sleep),查詢(query),連接(connect)。x0dx0atime列x0dx0a此這個狀態持續的時間,單位是秒。x0dx0astate列x0dx0a顯示使用當前連接的sql語句的狀態,很重要的列,後續會有所有的狀態的描述,請注意,state只是語句執行中的某一個狀態,一個 sql語句,以查詢為例,可能需要經過ing to tmp table,Sorting result,Sending data等狀態才可以完成x0dx0ainfo列x0dx0a顯示這個sql語句,因為長度有限,所以長的sql語句就顯示不全,但是一個判斷問題語句的重要依據。x0dx0ax0dx0a這個命令中最關鍵的就是state列,mysql列出的狀態主要有以下幾種:x0dx0aChecking tablex0dx0a正在檢查數據表(這是自動的)。x0dx0aClosing tablesx0dx0a正在將表中修改的數據刷新到磁碟中,同時正在關閉已經用完的表。這是一個很快的操作,如果不是這樣的話,就應該確認磁碟空間是否已經滿了或者磁碟是否正處於重負中。x0dx0aConnect Outx0dx0a復制從伺服器正在連接主伺服器。x0dx0ax0dx0aCopying to tmp table on diskx0dx0a由於臨時結果集大於tmp_table_size,正在將臨時表從內存存儲轉為磁碟存儲以此節省內存。x0dx0aCreating tmp tablex0dx0a正在創建臨時表以存放部分查詢結果。x0dx0adeleting from main tablex0dx0a伺服器正在執行多表刪除中的第一部分,剛刪除第一個表。x0dx0adeleting from reference tablesx0dx0a伺服器正在執行多表刪除中的第二部分,正在刪除其他表的記錄。x0dx0ax0dx0aFlushing tablesx0dx0a正在執行FLUSH TABLES,等待其他線程關閉數據表。x0dx0aKilledx0dx0a發送了一個kill請求給某線程,那麼這個線程將會檢查kill標志位,同時會放棄下一個kill請求。MySQL會在每次的主循環中檢查kill標志位,不過有些情況下該線程可能會過一小段才能死掉。如果該線程程被其他線程鎖住了,那麼kill請求會在鎖釋放時馬上生效。x0dx0aLockedx0dx0a被其他查詢鎖住了。x0dx0aSending datax0dx0a正在處理SELECT查詢的記錄,同時正在把結果發送給客戶端。x0dx0ax0dx0aSorting for groupx0dx0a正在為GROUP BY做排序。x0dx0aSorting for orderx0dx0a正在為ORDER BY做排序。x0dx0aOpening tablesx0dx0a這個過程應該會很快,除非受到其他因素的干擾。例如,在執ALTER TABLE或LOCK TABLE語句行完以前,數據表無法被其他線程打開。正嘗試打開一個表。x0dx0aRemoving plicatesx0dx0a正在執行一個SELECT DISTINCT方式的查詢,但是MySQL無法在前一個階段優化掉那些重復的記錄。因此,MySQL需要再次去掉重復的記錄,然後再把結果發送給客戶端。x0dx0ax0dx0aReopen tablex0dx0a獲得了對一個表的鎖,但是必須在表結構修改之後才能獲得這個鎖。已經釋放鎖,關閉數據表,正嘗試重新打開數據表。x0dx0aRepair by sortingx0dx0a修復指令正在排序以創建索引。x0dx0aRepair with keycachex0dx0a修復指令正在利用索引緩存一個一個地創建新索引。它會比Repair by sorting慢些。x0dx0aSearching rows for updatex0dx0a正在講符合條件的記錄找出來以備更新。它必須在UPDATE要修改相關的記錄之前就完成了。x0dx0aSleepingx0dx0a正在等待客戶端發送新請求.x0dx0ax0dx0aSystem lockx0dx0a正在等待取得一個外部的系統鎖。如果當前沒有運行多個mysqld伺服器同時請求同一個表,那麼可以通過增加--skip-external-locking參數來禁止外部系統鎖。x0dx0aUpgrading lockx0dx0aINSERT DELAYED正在嘗試取得一個鎖表以插入新記錄。x0dx0aUpdatingx0dx0a正在搜索匹配的記錄,並且修改它們。x0dx0ax0dx0aUser Lockx0dx0a正在等待GET_LOCK()。x0dx0aWaiting for tablesx0dx0a該線程得到通知,數據表結構已經被修改了,需要重新打開數據表以取得新的結構。然後,為了能的重新打開數據表,必須等到所有其他線程關閉這個表。以下幾種情況下會產生這個通知:FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE,或OPTIMIZE TABLE。x0dx0awaiting for handler insertx0dx0aINSERT DELAYED已經處理完了所有待處理的插入操作,正在等待新的請求。x0dx0a大部分狀態對應很快的操作,只要有一個線程保持同一個狀態好幾秒鍾,那麼可能是有問題發生了,需要檢查一下。x0dx0a還有其他的狀態沒在上面中列出來,不過它們大部分只是在查看伺服器是否有存在錯誤是才用得著。x0dx0ax0dx0a例如如圖:x0dx0ax0dx0a3、explain來了解SQL執行的狀態x0dx0aexplain顯示了mysql如何使用索引來處理select語句以及連接表。可以幫助選擇更好的索引和寫出更優化的查詢語句。x0dx0a使用方法,在select語句前加上explain就可以了:x0dx0a例如:x0dx0aexplain select surname,first_name form a,b where a.id=b.idx0dx0a結果如圖x0dx0ax0dx0aEXPLAIN列的解釋x0dx0atablex0dx0a顯示這一行的數據是關於哪張表的x0dx0atypex0dx0a這是重要的列,顯示連接使用了何種類型。從最好到最差的連接類型為const、eq_reg、ref、range、indexhe和ALLx0dx0apossible_keysx0dx0a顯示可能應用在這張表中的索引。如果為空,沒有可能的索引。可以為相關的域從WHERE語句中選擇一個合適的語句x0dx0akeyx0dx0a實際使用的索引。如果為NULL,則沒有使用索引。很少的情況下,MYSQL會選擇優化不足的索引。這種情況下,可以在SELECT語句 中使用USE INDEX(indexname)來強制使用一個索引或者用IGNORE INDEX(indexname)來強制MYSQL忽略索引x0dx0akey_lenx0dx0a使用的索引的長度。在不損失精確性的情況下,長度越短越好x0dx0arefx0dx0a顯示索引的哪一列被使用了,如果可能的話,是一個常數x0dx0arowsx0dx0aMYSQL認為必須檢查的用來返回請求數據的行數x0dx0aExtrax0dx0a關於MYSQL如何解析查詢的額外信息。將在表4.3中討論,但這里可以看到的壞的例子是Using temporary和Using filesort,意思MYSQL根本不能使用索引,結果是檢索會很慢x0dx0ax0dx0aextra列返回的描述的意義x0dx0aDistinctx0dx0a一旦MYSQL找到了與行相聯合匹配的行,就不再搜索了x0dx0aNot existsx0dx0aMYSQL優化了LEFT JOIN,一旦它找到了匹配LEFT JOIN標準的行,就不再搜索了x0dx0aRange checked for each Record(index map:#)x0dx0a沒有找到理想的索引,因此對於從前面表中來的每一個行組合,MYSQL檢查使用哪個索引,並用它來從表中返回行。這是使用索引的最慢的連接之一x0dx0aUsing filesortx0dx0a看到這個的時候,查詢就需要優化了。MYSQL需要進行額外的步驟來發現如何對返回的行排序。它根據連接類型以及存儲排序鍵值和匹配條件的全部行的行指針來排序全部行x0dx0aUsing indexx0dx0a列數據是從僅僅使用了索引中的信息而沒有讀取實際的行動的表返回的,這發生在對表的全部的請求列都是同一個索引的部分的時候x0dx0aUsing temporaryx0dx0a看到這個的時候,查詢需要優化了。這里,MYSQL需要創建一個臨時表來存儲結果,這通常發生在對不同的列集進行ORDER BY上,而不是GROUP BY上x0dx0aWhere usedx0dx0a使用了WHERE從句來限制哪些行將與下一張表匹配或者是返回給用戶。如果不想返回表中的全部行,並且連接類型ALL或index,這就會發生,或者是查詢有問題不同連接類型的解釋(按照效率高低的順序排序)x0dx0aconstx0dx0a表中的一個記錄的最大值能夠匹配這個查詢(索引可以是主鍵或惟一索引)。因為只有一行,這個值實際就是常數,因為MYSQL先讀這個值然後把它當做常數來對待x0dx0aeq_refx0dx0a在連接中,MYSQL在查詢時,從前面的表中,對每一個記錄的聯合都從表中讀取一個記錄,它在查詢使用了索引為主鍵或惟一鍵的全部時使用x0dx0arefx0dx0a這個連接類型只有在查詢使用了不是惟一或主鍵的鍵或者是這些類型的部分(比如,利用最左邊前綴)時發生。對於之前的表的每一個行聯合,全部記錄都將從表中讀出。這個類型嚴重依賴於根據索引匹配的記錄多少—越少越好x0dx0arangex0dx0a這個連接類型使用索引返回一個范圍中的行,比如使用>或<查找東西時發生的情況x0dx0aindexx0dx0a這個連接類型對前面的表中的每一個記錄聯合進行完全掃描(比ALL更好,因為索引一般小於表數據)x0dx0aALLx0dx0a這個連接類型對於前面的每一個記錄聯合進行完全掃描,這一般比較糟糕,應該盡量避免
5. 怎麼看mysql資料庫有沒有安裝成功
可以通過以下命令測試MySQL伺服器是否工作:
C:\>
C:\Program
Files\MySQL\MySQL
Server
5.1\bin\mysqlshowC:\>
C:\Program
Files\MySQL\MySQL
Server
5.1\bin\mysqlshow
-u
root
mysqlC:\>
C:\Program
Files\MySQL\MySQL
Server
5.1\bin\mysqladmin
version
status
procC:\>
C:\Program
Files\MySQL\MySQL
Server
5.1\bin\mysql
test
如果mysqld對客戶端程序TCP/IP連接的響應較慢,可能是DNS問題。此時,使用--skip-name-resolve選項啟動mysqld,在MySQL授權表的Host列只使用localhost和IP號。
可以通過--pipe或--protocol=PIPE選項強制MySQL客戶端使用命名管道連接代替TCP/IP連接,或指定.(階段)做為主機名。使用--socket選項指定管道名。
6. mysql基本語句詳細教程
看他們網上的,寫得都是千篇一律,同時,好多也寫得不是很好,下面是我自己總結的有關mysql的使用細節,也是我在學習過程中的一些記錄吧,希望對你有點幫助,後面有關存儲過程等相關操作還沒有總結好,下次總結好了再發給你吧,呵呵~~~~~
MySql學習筆記
MySql概述:MySql是一個種關聯資料庫管理系統,所謂關聯資料庫就是將數據保存在不同的表中,而不是將所有數據放在一個大的倉庫中。這樣就增加了速度與提高了靈活性。並且MySql軟體是一個開放源碼軟體。
注意,MySql所支持的TimeStamp的最大范圍的問題,在32位機器上,支持的取值范圍是年份最好不要超過2030年,然後如果在64位的機器上,年份可以達到2106年,而對於date、與datetime這兩種類型,則沒有關系,都可以表示到9999-12-31,所以這一點得注意下;還有,在安裝MySql的時候,我們一般都選擇Typical(典型安裝)就可以了,當然,如果還有其它用途的話,那最好選擇Complete(完全安裝);在安裝過程中,一般的還會讓你進行伺服器類型的選擇,分別有三種伺服器類型的選擇,(Developer(開發機)、Server Machine(伺服器)、Dedicated MySql Server Machine(專用MYSQL伺服器)),選擇哪種類型的伺服器,只會對配置向導對內存等有影響,不然其它方面是沒有什麼影響的;所以,我們如果是開發者,選擇開發機就可以啦;然後接下來,還會有資料庫使用情況對話框的選擇,我們只要按照默認就可以啦;
連接與斷開伺服器:
連接:在windows命令提示符下輸入類似如下命令集:mysql –h host –u user –p
例如,我在用的時候輸入的是:mysql –h localhost –u root –p
然後會提示要你輸入用戶密碼,這個時候,如果你有密碼的話,就輸入密碼敲回車,如果沒有密碼,直接敲回車,就可以進入到資料庫客戶端;連接遠程主機上的mysql,可以用下面的命令:mysql –h 159.0.45.1 –u root –p 123
斷開伺服器:在進入客戶端後,你可以直接輸入quit然後回車就可以了;
下面就資料庫相關命令進行相關說明
你可以輸入以下命令對資料庫表格或者資料庫進行相關操作,在這里就省略了,然後直接進行文字說明了;
Select version(),current_date;//從伺服器得到當前mysql的版本號與當前日期
Select user(); //得到當前資料庫的所有用戶
Use databasename; 進入到指定的資料庫當中,然後就可以操作這個資料庫當中的表格了
Show databases; //查詢目前資料庫中所有的資料庫,並且顯示出來;
Create batabase databasename;創建資料庫,例如:create database manager;
Show tables; //查看當前資料庫中的所有表格;
Create table tablename(colums);創建表,並且給表指定相關列,例如:create table pet(name varchar(20),owner varchar(20),species varchar(20),sex char(1),birth date,death date);
Describe tablename;將表當中的所有信息詳細顯示出來,例如:describe pet;
可以用命令一次插入多條記錄,例如:
Insert into pet values(『Puffball』,』Diane』,』hamster』,』f』,』1993-12-3』,null),( 『Puffball』,』Diane』,』hamster』,』f』,』1993-12-3』,now());
Select * from pet; 從pet表當中查詢出所有的記錄,顯示出來;
Delete from pet where id=1;刪除ID為1的那一條記錄;
Update pet set birth=』2001-1-3』 where name=』Bowser』;更新name為Bowser的記錄當中的birth欄位的值;
Select distinct owner from pet;從pet表中選擇出owner欄位的值唯一的行,如果有多行記錄這個欄位的值相同,則只顯示最後一次出現這一值的一行記錄;
有關日期計算:
Select name,birth,curdate(),(year(curdate())-year(birth)) as age from pet;
此處,year()函數用於提取對應欄位的年份,當然類似的還有month(),day()等;
在mysql當中,sql語句可以使用like查詢,可以用」_」配任何單個字元,用」%」配任意數目字元,並且SQL模式默認是忽略大小寫,例如:select * from pet where name like 『%fy』;
當然也可以用正則表達式模式進行配。
同時在sql當中,也要注意分組函數、排序函數、統計函數等相關用法,在這里只列舉一二;
Select species,count(*) from pet group by speceis;
Select * from pet order by birth desc;
查詢最大值的相關操作:
Select max(age) from pet;
取前多少項記錄,這個主要用於分頁查詢操作當中,
Select * from pet order by birth desc limit 3;取前三條記錄,
Select * from pet order by birth desc limit 0,3;這個可以用於分頁查詢,limit後面的第一個參數,是起始位置,第二個參數是取記錄條數;
有關創建表格自增長欄位的寫法:
Create table person(id int(4) not null auto_increment,name char(20) not null,primary key (id));
修改表操作:
向表中增加欄位:注意,在這個地方,如果是增加多個欄位的時候,就要用括弧括起來,不然會有問題,如果是單個欄位的話,不用括弧也沒事;
Alter table test add(address varchar(50) not null default 『xm』,email varchar(20) not null);
將表中某個欄位的名字修改或者修改其對應的相關屬性的時候,要用change對其進行操作;
Alter table test change email email varchar(20) not null default 『zz』;//不修改欄位名
Alter table test change email Email varchar(30) not null;//修改欄位名稱
刪除表中欄位:
Alter table test drop email;//刪除單個欄位
Alter table test drop address,drop email;//刪除多列
可以用Drop來取消主鍵與外鍵等,例如:
Alter table test drop foreign key fk_symbol;
刪除索引:
Drop index index_name on table_name;
例如:drop index t on test;
向表中插入記錄:注意,當插入表中的記錄並不是所有的欄位的時候,應該要在前面列出欄位名稱才行,不然會報錯;
Insert into test(name) values(『ltx』);
Insert into test values(1,』ltx』);
也可以向表中同時插入多列值,如:
Insert into test(name) values(『ltx』),(『hhy』),(『xf』);
刪除表中記錄:
Delete from test;//刪除表中所有記錄;
Delete from test where id=1;//刪除表中特定條件下的記錄;
當要從一個表或者多個表當中查詢出一些欄位然後把這些欄位又要插入到另一個表當中的時候,可以用insert …..select語法;
Insert into testt(name) (select name from test where id=4);
從文件中讀取行插入數據表中,可以用Load data infile語句;
Load data infile 『test.txt』 into table test;
可以用Describe語法進行獲取有關列的信息;
Describe test;//可以查看test表的所有信息,包括對應列欄位的數據類型等;
MySql事務處理相關語法;
開始一項新的事務:start transaction或者begin transaction
提交事務:commit
事務回滾:rollback
set autocommit true|false 語句可以禁用或啟用默認的autocommit模式,只可用於當前連接;
例子:
Start transaction;
Update person set name=』LJB』 where id=1;
Commit | rollback;
資料庫管理語句
修改用戶密碼:以root用戶為例,則可以寫成下面的;mysql –u root –p 舊密碼 –password 新密碼
Mysql –u root –password 123;//將root用戶的密碼修改成123,由於root用戶開始的時候,是沒有密碼的,所以-p舊密碼就省略了;
例如修改一個有密碼的用戶密碼:mysql –u ltx –p 123 –password 456;
增加一個用戶test1,密碼為abc,讓他可以在任何時候主機上登陸,並對所有資料庫有查詢、插入、修改、刪除的許可權。
Grant select,insert,update,delete on *.* to test1@」%」 identified by 『abc』;
增加一個test2用戶,密碼為abc,讓他只可以在localhost上登陸,並且可以對資料庫進行查詢、插入、修改、刪除操作;
Grant select,insert,update,delete on mydb.* to test2@localhost identified by 『abc』;
如果不想讓用戶test2有密碼,可以再輸入以下命令消掉密碼:
Grant select,insert,update,delete on mydb.* to test2@localhost identified by 「」;
備份資料庫常用命令:mysqlmp –h host –u username –p dbname>保存路徑與文件名
然後回車後,會讓你輸入用戶密碼,輸入密碼後,再回車就OK啦;
Mysqlmp –hlocalhost –uroot –p test >E:\db\test.sql
這一命令具體解釋下:
這個命令就是備份test資料庫,並且將備份的內容存儲為test.sql文件,並且保存在E:\db下面;
命令當中-p 前面的test是資料庫名,然後在資料庫名後面要跟上一個」>」,然後接下來,就是寫要保存的位置與保存文件的文件名;
將備份好的資料庫導入到資料庫當中去:也就是運行.sql文件將資料庫導入資料庫當中去->
首先你得創建資料庫,然後運行如下命令:mysql –hlocalhost –uroot –p linux<E:\db\test.sql然後回車,再輸入密碼就可以啦;
解釋下上面的命令:linux是就要導入的資料庫名字,然後後面要緊跟著「<」符號,然後後面就是要導入的資料庫文件;
將資料庫導出保存成XML文件、從XML文件導入數據到資料庫:
導出表中數據:mysql –X –h hostName –u userName –p Pwd –e 「use DatabaseName;sql;」 >xml文件名
或者用另外一種方式也行:mysqlmp –xml –h hostName –u userName –p pwd dbName tableName //這一種只用於顯示在當前的mysql客戶端,不保存到文件當中;
相關說明:-X代表的是文件的格式是XML,然後-e一寫不能掉,還有就是要用雙引號將要操作的語句括起來;單引號不行;
例如:mysql –X –hlocalhost –uroot –p –e 「use test;select * from pet;」>E:\db\out.xml
從XML文件導入數據到資料庫:
Insert into tableName values(1,load_file(『filepath』));
例如:insert into pet values(1,load_file(「E:\db\out.xml」));
查看資料庫狀態與查詢進程:
Show status;//查看狀態
Show processlist;//查看進程
更改用戶名,用以下命令:
Update set user=」新名字」 where user=」舊用戶名」;
給資料庫用戶設置管理員許可權:
Mysqladmin –h host –u username –p pwd;
以root用戶為例;
Mysqladmin –h localhost –u root –p 123;
存儲過程與函數
存儲程序和函數分別是用create procere和create function語句,一個程序要麼是一個程序要麼是一個函數,使用call語句來調用程序,並且程序只能用輸出變數傳回值;
要想在MySql5.1中創建子程序,必須具有create routine許可權,並且alter routine和execute許可權被自動授予它的創建者;
創建存儲過程:
首先聲明分隔符,所謂分隔符是指你通知mysql客戶端你已經輸入一個sql語句的字元或字元串符號,在這里我們就以「//」為分隔符;
Delimiter 分隔符\
如:delimiter //
再創建存儲過程:
Create procere 存儲過程名 ( )
聲明存儲過程開始:
begin
然後開始寫存儲過程體:
Select * from pet;
結束存儲過程:
End;//
剛剛的例子全部寫出來,完整的代碼就是:
Delimiter //
Create procere spt () //注意,這個地方,存儲過程名與括弧之間要有個空格
Begin
Select * from pet;
End;//到這里,整個存儲過程就算寫完啦
執行存儲過程:
Call 存儲過程名 ();//
如,我們執行剛剛創建的存儲過程,就是:
Call spt ();//
需要說明的是存儲過程名後面一定要加個空格,而後面那個括弧,則是用於傳送參數的參數列表;另外,我們創建存儲過程完成後,也只是創建了,但是只有調用call 存儲過程名 ();//後才算執行完畢,才能看到存儲過程的結果;
7. MySQL資料庫表被鎖、解鎖,刪除事務
在程序員的職業生涯中,總會遇到資料庫表被鎖的情況,前些天就又撞見一次。由於業務突發需求,各個部門都在批量操作、導出數據,而資料庫又未做讀寫分離,結果就是:資料庫的某張表被鎖了!
用戶反饋系統部分功能無法使用,緊急排查,定位是資料庫表被鎖,然後進行緊急處理。這篇文章給大家講講遇到類似緊急狀況的排查及解決過程,建議點贊收藏,以備不時之需。
用戶反饋某功能頁面報502錯誤,於是第一時間看服務是否正常,資料庫是否正常。在控制台看到資料庫CPU飆升,堆積大量未提交事務,部分事務已經阻塞了很長時間,基本定位是資料庫層出現問題了。
查看阻塞事務列表,發現其中有鎖表現象,本想利用控制台直接結束掉阻塞的事務,但控制台賬號許可權有限,於是通過客戶端登錄對應賬號將鎖表事務kill掉,才避免了情況惡化。
下面就聊聊,如果當突然面對類似的情況,我們該如何緊急響應?
想像一個場景,當然也是軟體工程師職業生涯中會遇到的一種場景:原本運行正常的程序,某一天突然資料庫的表被鎖了,業務無法正常運轉,那麼我們該如何快速定位是哪個事務鎖了表,如何結束對應的事物?
首先最簡單粗暴的方式就是:重啟MySQL。對的,網管解決問題的神器——「重啟」。至於後果如何,你能不能跑了,要你自己三思而後行了!
重啟是可以解決表被鎖的問題的,但針對線上業務很顯然不太具有可行性。
下面來看看不用跑路的解決方案:
遇到資料庫阻塞問題,首先要查詢一下表是否在使用。
如果查詢結果為空,那麼說明表沒在使用,說明不是鎖表的問題。
如果查詢結果不為空,比如出現如下結果:
則說明表(test)正在被使用,此時需要進一步排查。
查看資料庫當前的進程,看看是否有慢SQL或被阻塞的線程。
執行命令:
該命令只顯示當前用戶正在運行的線程,當然,如果是root用戶是能看到所有的。
在上述實踐中,阿里雲控制台之所以能夠查看到所有的線程,猜測應該使用的就是root用戶,而筆者去kill的時候,無法kill掉,是因為登錄的用戶非root的資料庫賬號,無法操作另外一個用戶的線程。
如果情況緊急,此步驟可以跳過,主要用來查看核對:
如果情況緊急,此步驟可以跳過,主要用來查看核對:
看事務表INNODB_TRX中是否有正在鎖定的事務線程,看看ID是否在show processlist的sleep線程中。如果在,說明這個sleep的線程事務一直沒有commit或者rollback,而是卡住了,需要手動kill掉。
搜索的結果中,如果在事務表發現了很多任務,最好都kill掉。
執行kill命令:
對應的線程都執行完kill命令之後,後續事務便可正常處理。
針對緊急情況,通常也會直接操作第一、第二、第六步。
這里再補充一些MySQL鎖相關的知識點:資料庫鎖設計的初衷是處理並發問題,作為多用戶共享的資源,當出現並發訪問的時候,資料庫需要合理地控制資源的訪問規則,而鎖就是用來實現這些訪問規則的重要數據結構。
根據加鎖的范圍,MySQL裡面的鎖大致可以分成全局鎖、表級鎖和行鎖三類。MySQL中表級別的鎖有兩種:一種是表鎖,一種是元數據鎖(metadata lock,MDL)。
表鎖是在Server層實現的,ALTER TABLE之類的語句會使用表鎖,忽略存儲引擎的鎖機制。表鎖通過lock tables… read/write來實現,而對於InnoDB來說,一般會採用行級鎖。畢竟鎖住整張表影響范圍太大了。
另外一個表級鎖是MDL(metadata lock),用於並發情況下維護數據的一致性,保證讀寫的正確性,不需要顯式的使用,在訪問一張表時會被自動加上。
常見的一種鎖表場景就是有事務操作處於:Waiting for table metadata lock狀態。
MySQL在進行alter table等DDL操作時,有時會出現Waiting for table metadata lock的等待場景。
一旦alter table TableA的操作停滯在Waiting for table metadata lock狀態,後續對該表的任何操作(包括讀)都無法進行,因為它們也會在Opening tables的階段進入到Waiting for table metadata lock的鎖等待隊列。如果核心表出現了鎖等待隊列,就會造成災難性的後果。
通過show processlist可以看到表上有正在進行的操作(包括讀),此時alter table語句無法獲取到metadata 獨占鎖,會進行等待。
通過show processlist看不到表上有任何操作,但實際上存在有未提交的事務,可以在information_schema.innodb_trx中查看到。在事務沒有完成之前,表上的鎖不會釋放,alter table同樣獲取不到metadata的獨占鎖。
處理方法:通過 select * from information_schema.innodb_trxG, 找到未提交事物的sid,然後kill掉,讓其回滾。
通過show processlist看不到表上有任何操作,在information_schema.innodb_trx中也沒有任何進行中的事務。很可能是因為在一個顯式的事務中,對表進行了一個失敗的操作(比如查詢了一個不存在的欄位),這時事務沒有開始,但是失敗語句獲取到的鎖依然有效,沒有釋放。從performance_schema.events_statements_current表中可以查到失敗的語句。
處理方法:通過performance_schema.events_statements_current找到其sid,kill 掉該session,也可以kill掉DDL所在的session。
總之,alter table的語句是很危險的(核心是未提交事務或者長事務導致的),在操作之前要確認對要操作的表沒有任何進行中的操作、沒有未提交事務、也沒有顯式事務中的報錯語句。
如果有alter table的維護任務,在無人監管的時候運行,最好通過lock_wait_timeout設置好超時時間,避免長時間的metedata鎖等待。
關於MySQL的鎖表其實還有很多其他場景,我們在實踐的過程中盡量避免鎖表情況的發生,當然這需要一定經驗的支撐。但更重要的是,如果發現鎖表我們要能夠快速的響應,快速的解決問題,避免影響正常業務,避免情況進一步惡化。所以,本文中的解決思路大家一定要收藏或記憶一下,做到有備無患,避免突然狀況下抓瞎。