本節討論安裝MySQL後應執行的任務:mysql
若有必要,初始化數據目錄並建立MySQL受權表,對於某些MySQL安裝方法,能夠自動爲你完成數據目錄初始化:linux
root
賬戶,密碼可防止未經受權訪問MySQL服務器。安裝MySQL後,必須初始化數據目錄,包括mysql
系統模式中的表:sql
本節描述如何爲非自動初始化數據目錄的MySQL安裝方法手動初始化數據目錄,對於某些建議的命令,它們能夠測試服務器是否可訪問且工做正常。shell
在MySQL 8.0中,默認的身份驗證插件已從mysql_native_password
更改成caching_sha2_password
,而'root'@'localhost'
管理賬戶默認使用caching_sha2_password
。
在此處顯示的示例中,服務器旨在在mysql
登陸賬戶的用戶ID下運行,若是賬戶不存在,請建立賬戶(請參閱建立mysql用戶和組),或者替換你計劃用於運行服務器的其餘現有登陸賬戶的名稱。數據庫
將位置更改成MySQL安裝的頂級目錄,一般是/usr/local/mysql
(根據須要調整系統的路徑名):安全
cd /usr/local/mysql
在目錄中,你將找到多個文件和子目錄,包括包含服務器以及客戶端和實用程序的bin
子目錄。服務器
secure_file_priv
系統變量將導入和導出操做限制爲特定目錄,建立一個目錄,其位置能夠指定爲該變量的值:網絡
mkdir mysql-files
將目錄用戶和組全部權授予mysql
用戶和mysql
組,並相應地設置目錄權限:數據結構
chown mysql:mysql mysql-files chmod 750 mysql-files
使用服務器初始化數據目錄,包括包含初始MySQL受權表的mysql
模式,該表肯定如何容許用戶鏈接到服務器,例如:框架
bin/mysqld --initialize --user=mysql
一般,只有在首次安裝MySQL後才須要進行數據目錄初始化,可是,初始化數據目錄的命令不會覆蓋任何現有的mysql
模式表,所以在任何狀況下均可以安全運行。
若是要部署自動支持安全鏈接的服務器,請使用mysql_ssl_rsa_setup
實用程序建立默認SSL和RSA文件:
bin/mysql_ssl_rsa_setup
/etc/my.cnf
或/etc/mysql/my.cnf
。例如,你可使用選項文件來設置secure_file_priv
系統變量。mysql
模式中建立時區表,但不填充它們。將位置更改成MySQL安裝的頂級目錄,一般是/usr/local/mysql
(根據須要調整系統的路徑名):
cd /usr/local/mysql
要初始化數據目錄,請使用--initialize
或--initialize-insecure
選項調用mysqld
,取決於你是但願服務器爲'root'@'localhost'
賬戶生成隨機初始密碼,仍是建立沒有密碼的賬戶:
--initialize
用於「默認安全」安裝(即包括生成隨機初始root
密碼),在這種狀況下,密碼標記爲已過時,你須要選擇一個新密碼。--initialize-insecure
,不會生成root
密碼,這是不安全的。假設你在將服務器投入生產使用以前及時爲賬戶分配密碼。
服務器將任何消息(包括任何初始密碼)寫入其標準錯誤輸出,這可能會重定向到錯誤日誌,所以,若是你沒有在屏幕上看到消息,請查看此處。在Windows上,使用
--console
選項將消息定向到控制檯。
在Unix和類Unix系統上,重要的是數據庫目錄和文件歸mysql
登陸賬戶全部,以便服務器在之後運行時對它們具備讀寫權限。要確保這一點,請從系統root
賬戶啓動mysqld
幷包含--user
選項,以下所示:
bin/mysqld --initialize --user=mysql bin/mysqld --initialize-insecure --user=mysql
或者,以mysql
身份登陸時執行mysqld
,在這種狀況下,你能夠省略命令中的--user
選項。
在Windows上,使用如下命令之一:
bin\mysqld --initialize --console bin\mysqld --initialize-insecure --console
若是缺乏必需的系統庫,數據目錄初始化可能會失敗,例如,你可能會看到以下錯誤:
bin/mysqld: error while loading shared libraries: libnuma.so.1: cannot open shared object file: No such file or directory
若是發生這種狀況,你必須手動或使用系統的軟件包管理器安裝缺乏的庫,而後重試數據目錄初始化命令。
若是mysqld
沒法識別安裝目錄或數據目錄的正確位置,則可能須要指定其餘選項,例如--basedir
或--datadir
,例如(在一行中輸入命令):
bin/mysqld --initialize --user=mysql --basedir=/opt/mysql/mysql --datadir=/opt/mysql/mysql/data
或者,將相關選項設置放在選項文件中,並將該文件的名稱傳遞給mysqld
,對於Unix和類Unix系統,假設選項文件名是/opt/mysql/mysql/etc/my.cnf
,將這些行放在文件中:
[mysqld] basedir=/opt/mysql/mysql datadir=/opt/mysql/mysql/data
而後按以下方式調用mysqld
(首先使用--defaults-file
選項在單行上輸入命令):
bin/mysqld --defaults-file=/opt/mysql/mysql/etc/my.cnf --initialize --user=mysql
在Windows上,假設C:\my.ini
包含如下行:
[mysqld] basedir=C:\\Program Files\\MySQL\\MySQL Server 8.0 datadir=D:\\MySQLdata
而後按以下方式調用mysqld
(首先使用--defaults-file
選項在單行上輸入命令):
bin\mysqld --defaults-file=C:\my.ini --initialize --console
服務器執行的數據目錄初始化序列不能替代mysql_secure_installation
和mysql_ssl_rsa_setup
執行的操做。
當使用--initialize
或--initialize-insecure
選項調用時,mysqld
在數據目錄初始化序列期間執行如下操做:
服務器檢查數據目錄是否存在,以下所示:
若是數據目錄存在但不爲空(即,它包含文件或子目錄),則在生成錯誤消息後服務器退出:
[ERROR] --initialize specified but the data directory exists. Aborting.
在這種狀況下,請刪除或重命名數據目錄,而後重試。
若是每一個條目的名稱都以句點(.)開頭,則容許現有數據目錄爲非空。
mysql
系統模式及其表,包括數據字典表、受權表、時區表和服務器端幫助表。服務器初始化管理InnoDB
表所需的系統表空間和相關數據結構。
在mysqld
設置InnoDB
系統表空間以後,對錶空間特性的某些更改須要設置一個全新的實例,符合條件的更改包括系統表空間中第一個文件的文件名和撤消日誌的數量。若是你不想使用默認值,請確保在運行mysqld
以前在mysql配置文件中設置了innodb_data_file_path
和innodb_log_file_size
配置參數。還要確保根據須要指定影響InnoDB
文件建立和位置的其餘參數,例如innodb_data_home_dir
和innodb_log_group_home_dir
。
若是這些選項在你的配置文件中,但該文件不在MySQL默認讀取的位置,請在運行mysqld
時使用--defaults-extra-file
選項指定文件位置。
服務器建立'root'@'localhost'
超級用戶賬戶和其餘保留賬戶,某些保留賬戶被鎖定且客戶端沒法使用,但'root'@'localhost'
用於管理用途,你應爲其分配密碼。
關於'root'@'localhost'
賬戶密碼的服務器操做取決於你調用它的方式:
使用--initialize
而不是--initialize-insecure
,服務器生成隨機密碼,將其標記爲已過時,並寫入顯示密碼的消息:
[Warning] A temporary password is generated for root@localhost: iTag*AfrH5ej
使用--initialize-insecure
,(使用或不使用--initialize
,由於--initialize-insecure
意味着--initialize
),服務器不會生成密碼或將其標記爲已過時,並寫入警告消息:
[Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
HELP
語句的服務器端help表,服務器不會填充時區表。--init-file
選項用於命名SQL語句的文件,則服務器執行文件中的語句,此選項使你能夠執行自定義引導序列。當服務器在引導模式下運行時,某些功能不可用,這限制了文件中容許的語句,這些包括與賬戶管理(例如CREATE USER
或GRANT
)、複製和全局事務標識符相關的語句。
經過使用--initialize
或--initialize-insecure
啓動服務器來初始化數據目錄後,正常啓動服務器(即,沒有這些選項)併爲'root'@'localhost'
賬戶分配一個新密碼:
鏈接到服務器:
若是你使用--initialize
而不是--initialize-insecure
來初始化數據目錄,請以root
身份鏈接到服務器:
mysql -u root -p
而後,在密碼提示符下,輸入服務器在初始化序列期間生成的隨機密碼:
Enter password: (enter the random root password here)
若是你不知道此密碼,請查看服務器錯誤日誌。
若是你使用--initialize-insecure
初始化數據目錄,請以root
身份而不使用密碼鏈接到服務器:
mysql -u root --skip-password
鏈接後,使用ALTER USER
語句分配新的root
密碼:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root-password';
嘗試鏈接到主機127.0.0.1
一般會解析爲localhost
賬戶,可是,若是使用--skip-name-resolve
選項運行服務器,則會失敗。若是你打算這樣作,請確保存在能夠接受鏈接的賬戶,例如,要可以使用--host=127.0.0.1
或--host=::1
以root
身份鏈接,請建立如下賬戶:
CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY 'root-password'; CREATE USER 'root'@'::1' IDENTIFIED BY 'root-password';
本節介紹如何在Unix和類Unix系統上啓動服務器,若是你的安裝包含mysqld_safe
,請啓動MySQL服務器:
shell> bin/mysqld_safe --user=mysql &
對於使用RPM軟件包安裝MySQL的Linux系統,使用systemd
而不是mysqld_safe
管理服務器啓動和關閉,並且未安裝mysqld_safe
。
若是你的安裝包含systemd
支持,請像這樣啓動服務器:
shell> systemctl start mysqld
若是它與mysqld
不一樣,則替換相應的服務名稱(例如,SLES系統上的mysql
)。
使用非特權(非root
)登陸賬戶運行MySQL服務器很是重要,要確保這一點,請以root
身份運行mysqld_safe
幷包含--user
選項,如上所示。不然,你應該以mysql
身份登陸時執行程序,在這種狀況下,你能夠省略命令中的--user
選項。
若是命令當即失敗並打印mysqld ended
,請在錯誤日誌中查找信息(默認狀況下是數據目錄中的host_name.err
文件)。
若是服務器沒法訪問數據目錄,它將啓動或讀取mysql模式中的受權表,它會將消息寫入其錯誤日誌。若是你在繼續執行此步驟以前經過初始化數據目錄而忽略了建立受權表,或者若是你運行了初始化數據目錄而沒有--user
選項的命令,則可能會出現此類問題,刪除數據目錄並使用--user
選項運行該命令。
本節提供有關啓動服務器問題的故障排除建議,若是你在啓動服務器時遇到問題,能夠嘗試如下方法:
檢查錯誤日誌以查看服務器沒法啓動的緣由,日誌文件位於數據目錄中(一般是Windows上的C:\Program Files\MySQL\MySQL Server 8.0\data
,/usr/local/mysql/data
用於Unix /Linux二進制分發版,/usr/local/var
用於Unix/Linux源碼發行版)。在數據目錄中查找名稱爲host_name.err
和host_name.log
的文件,其中host_name
是服務器主機的名稱。而後檢查這些文件的最後幾行,使用tail
顯示它們:
shell> tail host_name.err shell> tail host_name.log
my.cnf
文件併爲計劃使用的引擎指定啓動選項。若是你打算使用支持事務表(InnoDB
、NDB
)的存儲引擎,請確保在啓動服務器以前按照你的方式配置它們。雖然存儲引擎使用你省略的選項的默認值,但Oracle建議你查看可用選項,併爲你的安裝不適合的默認值的任何選項指定顯式值。
確保服務器知道在哪裏能夠找到數據目錄,mysqld
服務器使用此目錄做爲其當前目錄,這是它指望找到數據庫以及它但願寫入日誌文件的位置,服務器還將pid(進程ID)文件寫入數據目錄。
編譯服務器時,默認數據目錄位置是硬編碼的,要肯定默認路徑設置是什麼,請使用--verbose
和--help
選項調用mysqld
。若是數據目錄位於系統上的其餘位置,請在命令行或選項文件中使用mysqld
或mysqld_safe
的--datadir
選項指定該位置,不然,服務器將沒法正常工做。做爲--datadir
選項的替代方法,你可使用--basedir
指定mysqld
安裝MySQL的基本目錄的位置,而且mysqld
在那裏查找data
目錄。
要檢查指定路徑選項的效果,請使用--verbose
和--help
選項調用mysqld
,例如,若是將位置更改成安裝mysqld的目錄,而後運行如下命令,則會顯示使用/usr/local
的基目錄啓動服務器的效果:
shell> ./mysqld --basedir=/usr/local --verbose --help
你也能夠指定其餘選項,例如--datadir
,可是--verbose
和--help
必須是最後一個選項。
肯定所需的路徑設置後,啓動服務器而不使用--verbose
和--help
。
若是mysqld
當前正在運行,你能夠經過執行如下命令找出它正在使用的路徑設置:
shell> mysqladmin variables
或:
shell> mysqladmin -h host_name variables
host_name
是MySQL服務器主機的名稱。
確保服務器能夠訪問數據目錄,數據目錄及其內容的全部權和權限必須容許服務器讀取和修改它們。
若是在啓動mysqld
時得到Errcode 13
(這意味着權限被拒絕),這意味着數據目錄或其內容的權限不容許服務器訪問,在這種狀況下,你能夠更改所涉及文件和目錄的權限,以便服務器有權使用它們,你也能夠以root
身份啓動服務器,但這會引起安全問題,應該避免。
將位置更改成數據目錄並檢查數據目錄及其內容的全部權,以確保服務器具備訪問權限,例如,若是數據目錄是/usr/local/mysql/var
,請使用如下命令:
shell> ls -la /usr/local/mysql/var
若是數據目錄或其文件或子目錄不歸你用於運行服務器的登陸賬戶全部,請將其全部權更改成該賬戶,若是該賬戶名爲mysql
,請使用如下命令:
shell> chown -R mysql /usr/local/mysql/var shell> chgrp -R mysql /usr/local/mysql/var
即便擁有正確的全部權,若是你的系統上運行其餘安全軟件來管理對文件系統各個部分的應用程序訪問,MySQL也可能沒法啓動,在這種狀況下,從新配置該軟件以使mysqld
可以訪問它在正常操做期間使用的目錄。
驗證服務器要使用的網絡接口是否可用。
若是出現如下任一錯誤,則意味着某些其餘程序(多是另外一個mysqld
服務器)正在使用mysqld
嘗試使用的TCP/IP端口或Unix socket文件:
Can't start server: Bind on TCP/IP port: Address already in use Can't start server: Bind on unix socket...
使用ps
肯定是否有另外一個mysqld
服務器正在運行,若是是這樣,請在再次啓動mysqld
以前關閉服務器。
若是沒有其餘服務器正在運行,請執行命令telnet your_host_name tcp_ip_port_number
(默認的MySQL端口號是3306),而後按幾回回車鍵。若是你沒有收到相似的錯誤消息telnet: Unable to connect to remote host: Connection refused
,其餘一些程序正在使用mysqld
嘗試使用的TCP/IP端口。跟蹤這是什麼程序並禁用它,或告訴mysqld
使用--port
選項偵聽不一樣的端口,在這種狀況下,請在使用TCP/IP鏈接到服務器時爲客戶端程序指定相同的非默認端口號。
端口可能沒法訪問的另外一個緣由是你運行的防火牆阻止了與它的鏈接,若是是這樣,請修改防火牆設置以容許訪問端口。
若是服務器啓動但你沒法鏈接到它,請確保在/etc/hosts
中有一個以下所示的條目:
127.0.0.1 localhost
mysqld
,請嘗試使用--debug
選項建立跟蹤文件以查找問題。在初始化數據目錄並啓動服務器以後,執行一些簡單的測試以確保它可以使人滿意地工做,本節假定你當前的位置是MySQL安裝目錄,而且它具備包含此處使用的MySQL程序的bin
子目錄,若是不是這樣,請相應地調整命令路徑名。
或者,將bin
目錄添加到PATH
環境變量設置中,這使你的shell(命令解釋器)可以正確地找到MySQL程序,這樣你就能夠經過只輸入它的名字來運行一個程序,而不是它的路徑名。
使用mysqladmin
驗證服務器是否正在運行,如下命令提供簡單的測試,以檢查服務器是否已啓動並響應鏈接:
shell> bin/mysqladmin version shell> bin/mysqladmin variables
若是沒法鏈接到服務器,請指定-u root
選項以root
身份鏈接,若是你已經爲root賬戶分配了密碼,則還須要在命令行中指定-p
並在提示時輸入密碼,例如:
shell> bin/mysqladmin -u root -p version Enter password: (enter root password here)
mysqladmin version
的輸出略有不一樣,具體取決於你的平臺和MySQL版本,但應與此處顯示的相似:
shell> bin/mysqladmin version mysqladmin Ver 14.12 Distrib 8.0.19, for pc-linux-gnu on i686 ... Server version 8.0.19 Protocol version 10 Connection Localhost via UNIX socket UNIX socket /var/lib/mysql/mysql.sock Uptime: 14 days 5 hours 5 min 21 sec Threads: 1 Questions: 366 Slow queries: 0 Opens: 0 Flush tables: 1 Open tables: 19 Queries per second avg: 0.000
要查看使用mysqladmin
能夠執行的其餘操做,請使用--help
選項調用它。
驗證你是否能夠關閉服務器(若是root
賬戶已有密碼,請包含-p
選項):
確認你能夠再次啓動服務器,經過使用mysqld_safe
或直接調用mysqld
來完成此操做,例如:
shell> bin/mysqld_safe --user=mysql &
運行一些簡單的測試以驗證你是否能夠從服務器檢索信息,輸出應相似於此處顯示的輸出。
使用mysqlshow
查看存在哪些數據庫:
shell> bin/mysqlshow +--------------------+ | Databases | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+
已安裝數據庫的列表可能有所不一樣,但始終至少包含mysql
和information_schema
。
若是指定數據庫名稱,mysqlshow
將顯示數據庫中的表列表:
shell> bin/mysqlshow mysql Database: mysql +---------------------------+ | Tables | +---------------------------+ | columns_priv | | component | | db | | default_roles | | engine_cost | | func | | general_log | | global_grants | | gtid_executed | | help_category | | help_keyword | | help_relation | | help_topic | | innodb_index_stats | | innodb_table_stats | | ndb_binlog_index | | password_history | | plugin | | procs_priv | | proxies_priv | | role_edges | | server_cost | | servers | | slave_master_info | | slave_relay_log_info | | slave_worker_info | | slow_log | | tables_priv | | time_zone | | time_zone_leap_second | | time_zone_name | | time_zone_transition | | time_zone_transition_type | | user | +---------------------------+
使用mysql
程序從mysql
模式中的表中選擇信息:
shell> bin/mysql -e "SELECT User, Host, plugin FROM mysql.user" mysql +------+-----------+-----------------------+ | User | Host | plugin | +------+-----------+-----------------------+ | root | localhost | caching_sha2_password | +------+-----------+-----------------------+
此時,你的服務器正在運行,你能夠訪問它,若是你還沒有爲初始賬戶分配密碼,請增強安全性。
MySQL安裝過程涉及初始化數據目錄,包括定義MySQL賬戶的mysql
系統模式中的受權表。
本節介紹如何爲在MySQL安裝過程當中建立的初始root賬戶分配密碼(若是還沒有這樣作)。
執行本節所述過程的備選方法:
- 在Windows上,你能夠在使用MySQL Installer進行安裝期間執行該過程。
- 在全部平臺上,MySQL發行版都包含
mysql_secure_installation
,這是一個命令行實用程序,能夠自動完成保護MySQL安裝的大部分過程。- 在全部平臺上,MySQL Workbench均可用,並提供管理用戶賬戶的功能。
在這些狀況下,密碼可能已經分配給初始賬戶:
mysqld --initialize
手動執行的數據目錄初始化,mysqld
生成一個初始隨機密碼,將其標記爲已過時,並將其寫入服務器錯誤日誌。mysql.user
受權表定義了初始MySQL用戶賬戶及其訪問權限,安裝MySQL只會建立一個'root'@'localhost'
的超級用戶賬戶,該賬戶具備全部權限並能夠執行任何操做。若是root
賬戶的密碼爲空,則你的MySQL安裝不受保護:任何人均可以在沒有密碼的狀況下以root身份鏈接到MySQL服務器並得到全部權限。
'root'@'localhost'
賬戶在mysql.proxies_priv
表中也有一行,它容許爲'@'
授予PROXY
權限,即爲全部用戶和全部主機授予,這使root
可以設置代理用戶,以及委託其餘賬戶設置代理用戶的權限。
要爲初始MySQL root
賬戶分配密碼,請使用如下過程,將示例中的root-password替換爲你要使用的密碼。
若是服務器未運行,請啓動它。
初始root
賬戶可能有也可能沒有密碼,選擇如下適用的過程:
若是root
賬戶存在初始隨機密碼已過時,請使用該密碼以root
身份鏈接到服務器,而後選擇新密碼。若是數據目錄是使用mysqld --initialize
初始化的,手動或使用安裝程序,沒法在安裝操做期間爲你提供指定密碼的選項,因爲密碼存在,你必須使用它來鏈接到服務器。但因爲密碼已過時,除非你選擇新密碼,不然不能將該賬戶用於選擇新密碼以外的任何其餘目的。
使用密碼以root
身份鏈接到服務器:
shell> mysql -u root -p Enter password: (enter the random root password here)
選擇一個新密碼來替換隨機密碼:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'root-password';
若是root
賬戶存在但沒有密碼,請使用無密碼以root
身份鏈接到服務器,而後分配密碼,若是使用mysqld --initialize-insecure
初始化數據目錄,則會出現這種狀況。
使用無密碼以root
身份鏈接到服務器:
shell> mysql -u root --skip-password
分配密碼:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'root-password';
在爲root賬戶分配密碼後,只要使用該賬戶鏈接到服務器,就必須提供該密碼,例如,要使用mysql
客戶端鏈接到服務器,請使用如下命令:
shell> mysql -u root -p Enter password: (enter root password here)
要使用mysqladmin
關閉服務器,請使用如下命令:
shell> mysqladmin -u root -p shutdown Enter password: (enter root password here)
本節討論啓動和中止MySQL服務器的方法。
一般,你能夠經過如下方式之一啓動mysqld
服務器:
mysqld
,這適用於任何平臺。mysqld_safe
,它試圖肯定mysqld
的正確選項,而後用這些選項運行它。systemd
的Linux系統上,你可使用它來控制服務器。/etc/init.d
和運行級別特定目錄)的系統上,調用mysql.server
,此腳本主要用於系統啓動和關閉,它一般以mysql
的名稱安裝,mysql.server
腳本經過調用mysqld_safe
啓動服務器。mysqld_safe
啓動服務器,MySQL首選項窗格還提供了經過「系統偏好設置」啓動和中止MySQL的控件。systemd
、mysqld_safe
和mysql.server
腳本、Solaris SMF和macOS啓動項(或MySQL首選項窗格)可用於手動啓動服務器,或在系統啓動時自動啓動。systemd
、mysql.server
和啓動項也可用於中止服務器。
下表顯示了服務器和啓動腳本從選項文件中讀取的選項組。
MySQL啓動腳本和支持的服務器選項組
腳本 | 選項組 |
---|---|
mysqld |
[mysqld], [server], [mysqld-major_version] |
mysqld_safe |
[mysqld], [server], [mysqld_safe] |
mysql.server |
[mysqld], [mysql.server], [server] |
[mysqld-major_version]
表示名爲[mysqld-5.7]
和[mysqld-8.0]
的組由具備5.7.x,8.0.x等版本的服務器讀取,此特性可用於指定只能由給定版本系列中的服務器讀取的選項。
爲了向後兼容,mysql.server
還讀取[mysql_server]
組,mysqld_safe
也讀取[safe_mysqld]
組。要成爲最新的,你應該更新你的選項文件以使用[mysql.server]
和[mysqld_safe]
組。