跳到內容

MySQL/管理

來自 Wikibooks,開放世界中的開放書籍

Debian 包

[編輯 | 編輯原始碼]

包名通常是 mysql-server,要麼直接使用,要麼作為最新版本的過渡包。

穩定版

[編輯 | 編輯原始碼]

當前的 穩定版 中有兩個 Debian 包

您可以使用以下命令安裝它

apt-get install mysql-server

或者使用 Synaptic GUI 安裝您想要的包。

反向移植

[編輯 | 編輯原始碼]

Backports.org 也可能提供更新的版本。

要安裝它,您需要在 /etc/apt/sources.list 中新增反向移植源

deb http://www.backports.org/debian lenny-backports main

然後使用 aptitude

apt-get install -t lenny-backports mysql-server-5.1

解除安裝

[編輯 | 編輯原始碼]

要簡單地刪除程式

apt-get remove mysql-server

要刪除配置檔案,從而產生一個乾淨的環境

apt-get remove --purge mysql-server

Debconf 會詢問您是否要刪除現有的資料庫。請明智地回答!

Fedora Core 5

[編輯 | 編輯原始碼]

包名是 mysql-server

您可以使用以下命令安裝它

yum install mysql-server

它會安裝必要的依賴項。


使用 pirut(應用程式->新增/刪除軟體),您也可以在 伺服器 類別中找到 MySQL 資料庫 伺服器

MySQL 在主要的 Portage 樹中可用,名為“dev-db/mysql”。您必須使用完全限定的 ebuild 名稱,因為“mysql”會因“virtual/mysql”而變得不明確。

命令

emerge dev-db/mysql

穩定的 FreeBSD 埠是 5.0 版本,beta 版 5.1 也可用。

您可以使用以下命令安裝它

cd /usr/ports/databases/mysql50-server/ && make install clean

此命令將安裝 MySQL 5.0 伺服器以及所有必要的依賴項(包括 MySQL 客戶端)。t

啟動服務

[編輯 | 編輯原始碼]

在 Debian 中,您使用 mysql 初始化指令碼。

/etc/init.d/mysql start
/etc/init.d/mysql stop
/etc/init.d/mysql restart

如果您需要在指令碼中執行此操作,請優先使用 invoke-rc.d 命令,它只在服務在系統啟動時啟動的情況下才會重新啟動服務。這樣,您就不會在不需要執行服務的情況下啟動它。

invoke-rc.d mysql start|stop|restart

如果您想控制 MySQL 是否在啟動時啟動,可以使用 rcconf 包或 update-rc.d

cp /usr/local/mysql/support-files/mysql.server /etc/init.d/anysqlservernamehere
chmod +x /etc/init.d/anysqlservernamehere
update-rc.d anysqlservernamehere defaults

Fedora Core

[編輯 | 編輯原始碼]

Fedora Core 建議您使用 service 包裝器,它會在執行服務之前清理環境,以便所有服務在同一個標準環境中執行(例如,當前目錄設定為系統根目錄 /)。

service mysqld start|stop|restart
service mysqld --full-restart # means stop, then start - not a direct restart

如果需要,您也可以使用 /etc/init.d/mysqld

FC5 在您第一次啟動 MySQL 伺服器時(即啟動 /usr/bin/mysql_install_db 時)會顯示有用的提示。

$ service mysqld start
[...]
PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:
/usr/bin/mysqladmin -u root password 'new-password'
/usr/bin/mysqladmin -u root -h localhost password 'new-password'
[...] 

請參閱下一節瞭解更改密碼。

要控制 MySQL 是否在啟動時啟動,可以使用 ntsysv 工具:

客戶端連線

[編輯 | 編輯原始碼]

有兩種方法可以連線到 MySQL 伺服器,使用 Unix 套接字和 TCP/IP。

預設的 TCP/IP 埠是 3306

# grep mysql /etc/services
mysql           3306/tcp                        # MySQL
mysql           3306/udp                        # MySQL
mysql-cluster   1186/tcp                        # MySQL Cluster Manager
mysql-cluster   1186/udp                        # MySQL Cluster Manager
mysql-im        2273/tcp                        # MySQL Instance Manager
mysql-im        2273/udp                        # MySQL Instance Manager

作為客戶端,MySQL 將“localhost”解釋為“使用 Unix 套接字”。這意味著 MySQL 不會連線到 127.0.0.1:3306,而是會使用 /var/run/mysqld/mysqld.sock

$ mysql -h localhost
mysql> \s
--------------
mysql  Ver 14.12 Distrib 5.0.22, for redhat-linux-gnu (i386) using readline 5.0
[...]
Current user:           sylvain@localhost
[...]
Connection:             Localhost via UNIX socket
[...]
UNIX socket:            /var/lib/mysql/mysql.sock

如果您確實需要透過 TCP/IP 連線到本地主機上的 MySQL,而無需使用 Unix 套接字,那麼請指定“127.0.0.1”而不是“localhost”

$ mysql -h 127.0.0.1
mysql> \s
--------------
mysql  Ver 14.12 Distrib 5.0.22, for redhat-linux-gnu (i386) using readline 5.0
[...]
Current user:           sylvain@localhost
[...]
Connection:             127.0.0.1 via TCP/IP
[...]
TCP port:               3306

在這兩種情況下,MySQL 都將您的機器名稱理解為“localhost”(這在許可權系統中使用)。

配置 /etc/mysql/my.cnf - 用於負載很重的資料庫,用於大型資料庫...;不同型別的連線(Unix 套接字,帶或不帶 SSL 的 TCP/IP,MySQL+SSL 許可問題)

更改 root 密碼

[編輯 | 編輯原始碼]
$ mysql -u root
mysql> SET PASSWORD = PASSWORD('PassRoot');

更多資訊請參見#SET_PASSWORD部分。

網路配置

[編輯 | 編輯原始碼]
--bind-address=127.0.0.1 # localhost only
--bind-address=0.0.0.0 # listen on all interfaces
--bind-address=192.168.1.120 # listen on that IP only

skip-networking

[編輯 | 編輯原始碼]

當你在配置檔案中指定skip-networking時,MySQL將不會監聽任何埠,甚至包括本地主機(127.0.0.1)。這意味著只有與MySQL伺服器執行在同一臺機器上的程式才能連線到它。這在專用伺服器上是一種常見的設定。

聯絡MySQL的唯一方法是使用本地Unix套接字,例如/var/run/mysqld/mysqld.sock(Debian)或/var/lib/mysql/mysql.sock(FC5)。你可以使用配置檔案[mysqld]部分的socket引數指定套接字的位置。

[mysqld]
...
socket=/var/lib/mysql/mysql.sock

許可權

[編輯 | 編輯原始碼]

MySQL許可權系統。

MySQL要求你在連線到資料庫時進行身份驗證。你需要提供以下憑據:

  • 身份,由以下組成:
    • 使用者名稱
    • 機器名或IP地址(由伺服器自動檢測)
  • 密碼,用於證明你的身份

通常,支援MySQL的應用程式還會要求你提供資料庫名稱,但這不是憑據的一部分,因為它與你的身份無關。

然後,MySQL會將許可權與這些憑據關聯起來;例如,查詢給定資料庫、向另一個數據庫新增資料、建立其他資料庫或刪除現有資料庫等的許可權。

我是誰?

[編輯 | 編輯原始碼]

連線後,不一定能明顯地知道MySQL認為你是誰。CURRENT_USER()可以提供此資訊。

mysql> SELECT CURRENT_USER();
+----------------+
| CURRENT_USER() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

SHOW GRANTS

[編輯 | 編輯原始碼]

原型

SHOW GRANTS FOR user
SHOW GRANTS --current user

SHOW GRANTS允許你檢查給定使用者的當前許可權。例如,以下是使用者root的預設許可權:

mysql> SHOW GRANTS FOR 'root'@'localhost';
+---------------------------------------------------------------------+
| Grants for root@localhost                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
+---------------------------------------------------------------------+
1 row in set (0.00 sec)

你也可以使用SHOW GRANTS;檢查當前使用者的許可權。

GRANT命令允許你授予(GRANT)給定使用者許可權。

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, database.* 
TO 'user'@'localhost';

DROP USER

[編輯 | 編輯原始碼]
DROP USER 'mediawiki';
DROP USER 'mediawiki'@'host';

從v5.0.2開始,這也會刪除關聯的許可權。

在早期版本中,你還需要手動REVOKE其許可權。

REVOKE ALL PRIVILEGES ON database.* FROM 'user'@'host';
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'user'@'host';

SET PASSWORD

[編輯 | 編輯原始碼]

原型

SET PASSWORD [FOR user] = PASSWORD('your_password')

如果未指定user,則使用當前使用者(這在使用命令列連線到mysql時很有用)。

帶有顯式使用者的示例

SET PASSWORD FOR 'mediawiki'@'localhost' = PASSWORD('ifda8GQg');


有一個命令行同義詞

mysqladmin password 'your_password'

(帶有通常的連線選項-h -u-p

但是,在命令列中使用密碼存在安全風險。例如,如果root更改了他的MySQL密碼

root# mysqladmin password 'K2ekiEk3'

那麼另一個使用者可以透過檢視程序列表來監視他

user$ ps aux | grep mysqladmin
root      7768  0.0  0.1   7044  1516 pts/1    S+   16:57   0:00 mysqladmin password K2ekiEk3

結論:不要使用mysqladmin password


如果你正在尋找生成密碼的方法,無論是安全的還是易於記憶的,請嘗試使用pwgen程式(有一個Debian包可用)

$ pwgen
ooGoo7ba ir4Raeje Ya2veigh zaXeero8 Dae8aiqu rai9ooYi phoTi6gu Yeingo9r
tho9aeDa Ohjoh6ai Aem8chee aheich8A Aelaeph3 eu4Owudo koh6Iema oH6ufuya
[...]
$ pwgen -s # secure
zCRhn8LH EJtzzLRE G4Ezb5BX e7hQ88In TB8hE6nn f8IqdMVQ t7BBDWTH ZZMhZyhR
gbsXdIes hCQMbPE6 XD8Owd0b xitloisw XCWKX9B3 MEATkWHH vW2Y7HnA 3V5ubf6B
[...]

如果你管理很多帳戶,這將非常方便!

MySQL 4.1密碼問題

[編輯 | 編輯原始碼]

從4.1版本開始,MySQL引入了一個與密碼相關的更改。

你將透過以下錯誤體驗到這一點:客戶端不支援伺服器請求的身份驗證協議;請考慮升級MySQL客戶端[1]

如果你希望支援較舊的客戶端程式,你需要以這種方式定義MySQL帳戶密碼

SET PASSWORD [FOR user] = OLD_PASSWORD('your_pass');

顯然,無法使用舊的密碼與GRANT ... IDENTIFIED BY 'password'語法一起使用。

或者,你可以在伺服器的my.cnf檔案中使用old_passwords配置選項。這意味著新的密碼將使用舊式、更短、安全性更低的格式進行編碼。例如,在Debian Sarge和FC5中,MySQL預設配置強制使用舊式密碼,以保持與舊客戶端的向後相容性

[mysqld]
...
old_passwords=1
  1. 例如,你可能在Debian Sarge的apache+libapache_mod_php4+php4-mysql上遇到此錯誤,後者依賴於libmysqlclient12,即MySQL 4.0(ldd /usr/lib/php4/20020429/mysql.so顯示libmysqlclient.so.12 => /usr/lib/libmysqlclient.so.12)。如果你依賴libmysqlclient14或更高版本,那麼你的應用程式將同時支援舊密碼格式和新密碼格式。

MySQL提供了一種類似於Unix的方式來顯示當前的伺服器執行緒並終止它們。

SHOW PROCESSLIST

[編輯 | 編輯原始碼]

這是一個正常的MySQL伺服器

mysql> SHOW PROCESSLIST;
+----+-----------+-----------+-----------+---------+------+-------+------------------+
| Id | User      | Host      | db        | Command | Time | State | Info             |
+----+-----------+-----------+-----------+---------+------+-------+------------------+
| 34 | monddprod | localhost | monddprod | Sleep   | 1328 |       | NULL             |
| 43 | root      | localhost | NULL      | Query   |    0 | NULL  | SHOW PROCESSLIST |
+----+-----------+-----------+-----------+---------+------+-------+------------------+
2 rows in set (0.00 sec)

mysqladmin提供了一個命令行同義詞

$ mysqladmin processlist
+----+-----------+-----------+-----------+---------+------+-------+------------------+
| Id | User      | Host      | db        | Command | Time | State | Info             |
+----+-----------+-----------+-----------+---------+------+-------+------------------+
| 34 | monddprod | localhost | monddprod | Sleep   | 1368 |       |                  |
| 44 | root      | localhost |           | Query   | 0    |       | show processlist |
+----+-----------+-----------+-----------+---------+------+-------+------------------+

如果一個繁重的、糟糕的查詢在你的伺服器上消耗了太多資源,你需要關閉它。

TODO: Add a sample SHOW PROCESSLIST output here

最直接的方法是重啟伺服器

/etc/init.d/mysql restart

一種更巧妙的方法是使用SHOW PROCESSLIST來識別糟糕的查詢,並將其獨立於其他伺服器執行緒終止。

mysql> KILL 342;
Query OK, 0 rows affected (0.00 sec)

還有一個命令行同義詞

$ mysqladmin kill 342

安全性

[編輯 | 編輯原始碼]

基本安全性:防火牆(iptables)、SELinux?另外,一些關於以下內容的說明:不要以明文形式儲存密碼

備份/恢復和匯入/匯出技術。

mysqldump

[編輯 | 編輯原始碼]
mysqldump --opt -h 192.168.2.105 -u john -p'****' mybase | gzip > mybase-`date +%Y%m%d`.sql.gz

這將建立mybase-20061027.sql.gz檔案。

--opt是一個神奇的選項,它使用所有通常有用的選項。在最近版本的mysqldump中,它甚至預設啟用,因此你無需鍵入它。--opt表示--add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset - 所以它將在備份期間鎖定表以確保一致性,新增DROP TABLE語句,以便可以在不清理目標資料庫的情況下應用轉儲,將使用最有效的方式執行INSERT操作並指定使用的字元集(latin1、Unicode/UTF-8...)。

如果你沒有為mysqldump提供資料庫,你將獲得一個包含所有資料庫的備份 - 這在以後恢復單個數據庫時不太方便。

使用logrotate每天輪換mysqldump

[編輯 | 編輯原始碼]

我們以一種略微非標準的方式使用logrotate來保留一批轉儲檔案。每天,logrotate都會迴圈轉儲檔案以保留最後N個轉儲檔案,自動刪除舊的備份,並透過一個postrotate鉤子立即生成新的轉儲檔案。

以下配置保留了2個月的每日備份

/dumps/mybase.sql.gz {
        rotate 60
        dateext
        dateyesterday
        daily
        nocompress
        nocopytruncate
        postrotate
          HOME=/root mysqldump --opt mybase | gzip > /dumps/mybase.sql.gz
        endscript
}

有關更多資訊,請參閱GNU/Linux手冊頁中的logrotate(8)。

備份所有資料庫的變體

/dumps/*/*.sql.gz {
        daily
        rotate 20
        dateext
        dateyesterday
        nocompress
        sharedscripts
        create
        postrotate
                export HOME=/root
                for i in $(mysql --batch --skip-column-names -e 'SHOW DATABASES' | grep -vE '^information_schema|performance_schema$'); do
                        if [ ! -e /dumps/$i ]; then mkdir -m 700 /dumps/$i; fi
                        mysqldump --events $i | gzip -c > /dumps/$i/$i.sql.gz
                done
        endscript
}

設定

  • 為無密碼資料庫訪問建立你的~/.my.cnf
  • 將上面的logrotate配置檔案放置在/etc/logrotate.d/目錄中
  • 引導第一個轉儲
    • mkdir -m 700 /dumps
    • mkdir -m 700 /dumps/mybase
    • touch /dumps/mybase/mybase.sql.gz
    • logrotate -f /etc/logrotate.d/mysql-dumps
  • 使用 zcat /dumps/mybase.sql.gz 檢查轉儲。


程式碼註釋:對於在 cron 中設定 HOME=/ 的系統(例如 FC5),需要使用 HOME=/root,以防止 mysqldump 找不到 .my.cnf 配置檔案。我們還使用 | gzip 而不是 logrotate 的 compress 選項,以提高磁碟 I/O 效率(單步操作)。


在生產環境中,您將獲得類似以下內容

# ls -lt /dumps
total 16520
-rw-r----- 1 root clisscom 2819533 mar  2 06:25 clisscom.sql.gz
-rw-r----- 1 root clisscom 2815193 mar  1 06:25 clisscom.sql.gz-20100302
-rw-r----- 1 root clisscom 2813579 fév 28 06:26 clisscom.sql.gz-20100301
-rw-r----- 1 root clisscom 2812251 fév 27 06:25 clisscom.sql.gz-20100228
-rw-r----- 1 root clisscom 2810803 fév 26 06:25 clisscom.sql.gz-20100227
-rw-r----- 1 root clisscom 2808785 fév 25 06:25 clisscom.sql.gz-20100226
...

請注意,檔名中的日期是輪換日期,而不是轉儲日期。使用 dateext 有助於遠端備份,因為檔名不會每天更改,因此您無需每次都重新下載所有 /dumps

使用 CGI 進行遠端 mysqldump

[編輯 | 編輯原始碼]

有時可以在共享主機設施中找到 mysqldump。您可以使用簡單的 CGI 指令碼獲取直接轉儲

#!/bin/sh

echo "Content-Type: application/x-tar"
echo "Content-Encoding: x-gzip"
echo ""

mysqldump --host=mysql.hosting.com --user=john --password=XXXXX my_base | gzip 2>&1

然後,您可以使用瀏覽器或 wget 獲取它

$ wget -O- --quiet https:///~sylvain/test2.cgi > base-`date +%Y%m%d`.sql.gz

您甚至可以在本地測試資料庫中即時重新注入它

$ wget -O- --quiet https:///~sylvain/test2.cgi | gunzip | mysql test_install -u myself -pXXXX

使用 .htaccess 保護指令碼,為 wget 編寫 .netrc,您將擁有一個簡單、無人值守的方式來抓取備份,即使沒有命令列訪問許可權。這允許在抓取轉儲時節省時間(與使用 phpMyAdmin 相比)並設定遠端自動備份(無需互動)。

如果您有權訪問 exec(),類似的東西應該在 PHP 中可行。

匯出單個表

[編輯 | 編輯原始碼]

如果您需要匯入/匯出表(而不是完整資料庫),請檢視 MySQL/Language#Import_.2F_export

二進位制日誌

[編輯 | 編輯原始碼]

二進位制日誌是一種機制,用於跟蹤 MySQL 伺服器上發生的所有事件(取證),允許在不同的計算機(主/從複製)上或在以後的時間(崩潰恢復)上重放相同的命令序列。

在 Debian 上,它們儲存在 /var/log/mysql/mysql-bin.0* 中。

要檢視二進位制日誌中的 SQL 命令,請使用 mysqlbinlog 命令

mysqlbinlog /var/log/mysql/mysql-bin.000001

為了使崩潰恢復有用,二進位制日誌通常儲存在不同的計算機上(例如,透過 NFS 掛載)。請注意,它旨在恢復整個 mysql 伺服器,而不僅僅是一個數據庫。您可以嘗試按資料庫過濾日誌,但這並不簡單。

因此,為了使用二進位制日誌作為恢復計劃,您通常將它們與完整的標準備份結合使用

mysqldump -A | gzip > all.sql.gz

要同時重新整理/重置日誌(待辦事項:測試)

mysqldump -A --master-data --flush-logs | gzip > all.sql.gz

要恢復,您只需將這兩個來源合併起來(最好在恢復期間停用伺服器配置中的二進位制日誌記錄,並在之後重新啟用它)。

(zcat all.sql.gz && mysqlbinlog /var/log/mysql/mysql-bin.0*) | mysql

有趣日誌的位置,常見的錯誤要檢視。例如

tail -f /var/log/mysql.log

管理工具

[編輯 | 編輯原始碼]

各種第三方圖形介面和實用程式。

Web 介面

[編輯 | 編輯原始碼]

桌面 GUI

[編輯 | 編輯原始碼]
  • MySQL 管理員: 來自 MySQL AB。但是,如果您想建立真正的備份,請不要使用它,因為它使用客戶端機器上的 at 執行備份,而客戶端機器可能並非每天都線上。
華夏公益教科書