MySQL/管理
包名通常是 mysql-server,要麼直接使用,要麼作為最新版本的過渡包。
當前的 穩定版 中有兩個 Debian 包
- mysql-server: 依賴於最新版本的 MySQL
- mysql-server-5.0: MySQL 5.0
您可以使用以下命令安裝它
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 會詢問您是否要刪除現有的資料庫。請明智地回答!
包名是 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 建議您使用 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 許可問題)
$ 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時,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 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 '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 [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 [...]
如果你管理很多帳戶,這將非常方便!
從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
- ↑ 例如,你可能在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的方式來顯示當前的伺服器執行緒並終止它們。
這是一個正常的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 --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來保留一批轉儲檔案。每天,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 /dumpsmkdir -m 700 /dumps/mybasetouch /dumps/mybase/mybase.sql.gzlogrotate -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。
有時可以在共享主機設施中找到 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
各種第三方圖形介面和實用程式。
- phpMyAdmin (維基百科:phpMyAdmin)
- eSKUeL:phpMyAdmin 的替代方案
- 伺服器上 MySQL 支援
- MySQL 管理員: 來自 MySQL AB。但是,如果您想建立真正的備份,請不要使用它,因為它使用客戶端機器上的
at執行備份,而客戶端機器可能並非每天都線上。
