安裝 MySQL 後,必須初始化資料目錄,包括 mysql
系統架構中的資料表
對於某些 MySQL 安裝方法,資料目錄初始化是自動的,如第 2.9 節,「安裝後設定與測試」中所述。
對於其他安裝方法,您必須手動初始化資料目錄。這些方法包括在 Unix 和類 Unix 系統上從通用二進位檔案和原始碼發行版進行安裝,以及在 Windows 上從 ZIP 封存套件進行安裝。
本節說明如何針對資料目錄初始化不是自動的 MySQL 安裝方法手動初始化資料目錄。如需啟用測試伺服器是否可存取且正常運作的一些建議命令,請參閱第 2.9.3 節,「測試伺服器」。
預設的驗證外掛程式是 caching_sha2_password
,且 'root'@'localhost'
管理帳戶預設使用 caching_sha2_password
。
mysql_native_password(MySQL 8.0 之前的預設驗證外掛程式)仍然支援,但從 MySQL 8.4.0 開始預設為停用,並從 MySQL 9.0.0 開始移除。
在此處顯示的範例中,伺服器預計在 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 後才需要執行資料目錄初始化。(對於升級到現有安裝,請改為執行升級程序;請參閱第 3 章,《升級 MySQL》。) 但是,初始化資料目錄的命令不會覆寫任何現有的
mysql
架構資料表,因此在任何情況下執行都是安全的。在沒有任何選項檔案的情況下,伺服器會以其預設設定啟動。(請參閱第 7.1.2 節,「伺服器組態預設值」。)若要明確指定 MySQL 伺服器在啟動時應使用的選項,請將它們放在選項檔案中,例如
/etc/my.cnf
或/etc/mysql/my.cnf
。(請參閱第 6.2.2.2 節,「使用選項檔案」。)例如,您可以使用選項檔案來設定secure_file_priv
系統變數。若要讓 MySQL 在系統開機時自動啟動,請參閱第 2.9.5 節,「自動啟動和停止 MySQL」。
資料目錄初始化會在
mysql
結構描述中建立時區表格,但不會填入資料。若要執行此操作,請使用第 7.1.15 節,「MySQL 伺服器時區支援」中的指示。
將位置變更為 MySQL 安裝的最上層目錄,通常為 /usr/local/mysql
(根據您的系統需要調整路徑名稱)
cd /usr/local/mysql
若要初始化資料目錄,請使用 --initialize
或 --initialize-insecure
選項來調用 mysqld,具體取決於您是否希望伺服器為 'root'@'localhost'
帳戶產生隨機初始密碼,或是建立不含密碼的該帳戶。
對於「預設安全」安裝(即包含產生隨機初始
root
密碼),請使用--initialize
。在這種情況下,密碼會被標記為已過期,您必須選擇一個新的密碼。使用
--initialize-insecure
,不會產生root
密碼。這是非安全的;假設您打算在將伺服器投入生產使用之前及時為該帳戶指派密碼。
有關指派新的 'root'@'localhost'
密碼的說明,請參閱初始化後的 root 密碼指派。
伺服器會將任何訊息(包括任何初始密碼)寫入其標準錯誤輸出。這可能會被重新導向至錯誤日誌,因此如果您的螢幕上沒有看到訊息,請查看那裡。有關錯誤日誌的資訊,包括其位置,請參閱第 7.4.2 節,「錯誤日誌」。
在 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.4
datadir=D:\\MySQLdata
然後如下調用 mysqld(同樣,您應該在一行中輸入命令,先使用 --defaults-file
選項)
bin\mysqld --defaults-file=C:\my.ini
--initialize --console
初始化資料目錄時,您不應指定任何選項,除了用於設定目錄位置的選項,例如 --basedir
或 --datadir
,以及在需要時使用的 --user
選項。在初始化後重新啟動 MySQL 伺服器時,可以設定 MySQL 伺服器在正常使用時應採用的選項。有關更多資訊,請參閱 --initialize
選項的描述。
伺服器執行的資料目錄初始化順序不能取代 mysql_secure_installation 所執行的動作。
當使用 --initialize
或 --initialize-insecure
選項調用時,mysqld 在資料目錄初始化順序期間執行以下動作
伺服器檢查資料目錄是否存在,如下所示
如果不存在資料目錄,伺服器會建立它。
如果資料目錄存在但不為空(也就是說,它包含檔案或子目錄),則伺服器會在產生錯誤訊息後退出
[ERROR] --initialize specified but the data directory exists. Aborting.
在這種情況下,移除或重新命名資料目錄,然後重試。
如果每個條目的名稱都以句點 (
.
) 開頭,則允許現有的資料目錄不為空。
在資料目錄中,伺服器會建立
mysql
系統結構描述及其表格,包括資料字典表格、授權表格、時區表格和伺服器端說明表格。請參閱第 7.3 節,「mysql 系統結構描述」。伺服器會初始化 系統表格空間和管理
InnoDB
表格所需的相關資料結構。注意在 mysqld 設定
InnoDB
系統表格空間後,對表格空間特性的某些變更需要設定全新的實例。符合資格的變更包括系統表格空間中第一個檔案的檔案名稱和復原日誌的數量。如果您不想使用預設值,請確保 MySQL 組態檔案中的innodb_data_file_path
和innodb_log_file_size
組態參數的設定在執行 mysqld 之前就已到位。此外,請確保根據需要指定影響InnoDB
檔案建立和位置的其他參數,例如innodb_data_home_dir
和innodb_log_group_home_dir
。如果這些選項在您的組態檔案中,但該檔案不在 MySQL 預設讀取的位置,請在執行 mysqld 時,使用
--defaults-extra-file
選項來指定檔案位置。伺服器會建立
'root'@'localhost'
超級使用者帳戶和其他保留帳戶(請參閱第 8.2.9 節,「保留帳戶」)。某些保留帳戶已鎖定,用戶端無法使用,但'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.
有關指派新的
'root'@'localhost'
密碼的說明,請參閱初始化後的 root 密碼指派。伺服器會填入用於
HELP
陳述式(請參閱 章節 15.8.3,「HELP 陳述式」)的伺服器端說明表。伺服器不會填入時區表。若要手動執行此操作,請參閱 章節 7.1.15,「MySQL 伺服器時區支援」。如果
init_file
系統變數被指定為包含 SQL 陳述式的文件,則伺服器會執行該文件中的陳述式。此選項可讓您執行自訂的啟動序列。當伺服器在啟動模式下運作時,某些功能將無法使用,這會限制文件中允許的陳述式。這些包括與帳戶管理(例如
CREATE USER
或GRANT
)、複寫和全域交易識別碼相關的陳述式。伺服器會結束。
在使用 --initialize
或 --initialize-insecure
啟動伺服器以初始化資料目錄之後,請正常啟動伺服器(也就是說,不使用這些選項的任何一個),並為 'root'@'localhost'
帳戶指派新的密碼。
啟動伺服器。如需指示,請參閱 章節 2.9.2,「啟動伺服器」。
連線至伺服器。
如果您使用
--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';
另請參閱 章節 2.9.4,「保護初始 MySQL 帳戶的安全」。
嘗試連線到主機 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';
您可以將這些陳述式放入文件中,以便使用 init_file
系統變數執行,如 資料目錄初始化期間的伺服器動作中所述。