文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  初始化資料目錄

2.9.1 初始化資料目錄

安裝 MySQL 之後,必須初始化資料目錄,包括 mysql 系統架構中的資料表

  • 對於某些 MySQL 安裝方法,資料目錄初始化是自動的,如第 2.9 節,「安裝後設定和測試」所述。

  • 對於其他安裝方法,您必須手動初始化資料目錄。這些方法包括從 Unix 和類 Unix 系統上的通用二進位檔案和原始碼發行版本安裝,以及從 Windows 上的 ZIP 封存套件安裝。

本節說明如何針對資料目錄初始化不是自動的 MySQL 安裝方法,手動初始化資料目錄。關於測試伺服器是否可存取且正常運作的建議命令,請參閱第 2.9.3 節,「測試伺服器」

注意

預設的驗證外掛程式是 caching_sha2_password,而且 'root'@'localhost' 管理帳戶預設會使用 caching_sha2_password

資料目錄初始化概述

在此處顯示的範例中,伺服器旨在以 mysql 登入帳戶的使用者 ID 執行。如果該帳戶不存在,請建立帳戶 (請參閱建立 mysql 使用者和群組),或取代您計畫用於執行伺服器的其他現有登入帳戶的名稱。

  1. 將位置變更為 MySQL 安裝的頂層目錄,通常是 /usr/local/mysql(請根據您的系統調整路徑名稱)

    cd /usr/local/mysql

    在此目錄中,您可以找到數個檔案和子目錄,包括包含伺服器以及用戶端和公用程式的 bin 子目錄。

  2. secure_file_priv 系統變數會將匯入和匯出作業限制為特定目錄。建立一個目錄,其位置可以指定為該變數的值

    mkdir mysql-files

    將目錄使用者和群組擁有權授與 mysql 使用者和 mysql 群組,並適當設定目錄權限

    chown mysql:mysql mysql-files
    chmod 750 mysql-files
  3. 使用伺服器初始化資料目錄,包括包含決定允許使用者如何連線至伺服器的初始 MySQL 授與資料表的 mysql 架構。例如

    bin/mysqld --initialize --user=mysql

    關於命令的重要資訊,特別是關於您可能會使用的命令選項,請參閱資料目錄初始化程序。關於伺服器如何執行初始化的詳細資訊,請參閱資料目錄初始化期間的伺服器動作

    通常,資料目錄初始化只需要在您第一次安裝 MySQL 後執行。(若要升級至現有的安裝,請改為執行升級程序;請參閱第 3 章,升級 MySQL。)不過,初始化資料目錄的命令不會覆寫任何現有的 mysql 架構資料表,因此在任何情況下執行都是安全的。

  4. 在沒有任何選項檔的情況下,伺服器會以其預設設定啟動。(請參閱第 7.1.2 節,「伺服器組態預設值」。)若要明確指定 MySQL 伺服器在啟動時應使用的選項,請將它們放在選項檔中,例如 /etc/my.cnf/etc/mysql/my.cnf。(請參閱第 6.2.2.2 節,「使用選項檔」。)例如,您可以使用選項檔來設定 secure_file_priv 系統變數。

  5. 若要安排 MySQL 在系統啟動時自動啟動而無需手動介入,請參閱第 2.9.5 節,「自動啟動和停止 MySQL」

  6. 資料目錄初始化會在 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 9.0
datadir=D:\\MySQLdata

然後如下呼叫 mysqld(同樣,您應該在單行輸入命令,並將 --defaults-file 選項放在第一位)

bin\mysqld --defaults-file=C:\my.ini
   --initialize --console
重要事項

初始化資料目錄時,您不應指定用於設定目錄位置(例如 --basedir--datadir)以外的任何選項,以及在需要時使用的 --user 選項。MySQL 伺服器在正常使用期間要使用的選項可以在初始化後重新啟動時設定。如需更多資訊,請參閱 --initialize 選項的說明。

資料目錄初始化期間的伺服器動作

注意

伺服器執行的資料目錄初始化順序不會取代 mysql_secure_installation 執行的動作。

當使用 --initialize--initialize-insecure 選項呼叫時,mysqld 會在資料目錄初始化順序期間執行下列動作

  1. 伺服器會檢查資料目錄是否存在,如下所示

    • 如果不存在資料目錄,伺服器會建立它。

    • 如果資料目錄存在但不是空的(也就是說,它包含檔案或子目錄),伺服器會在產生錯誤訊息後結束。

      [ERROR] --initialize specified but the data directory exists. Aborting.

      在這種情況下,請移除或重新命名資料目錄,然後再試一次。

      如果每個項目的名稱都以句點 (.) 開頭,則允許現有的資料目錄為非空的。

  2. 在資料目錄中,伺服器會建立 mysql 系統綱要及其表格,包括資料字典表格、授與表格、時區表格和伺服器端說明表格。請參閱第 7.3 節「mysql 系統綱要」

  3. 伺服器會初始化 系統表空間和管理 InnoDB 表格所需的相關資料結構。

    注意

    mysqld 設定 InnoDB 系統表空間之後,表空間特性的某些變更需要設定全新的執行個體。符合條件的變更包括系統表空間中第一個檔案的檔案名稱和復原日誌的數量。如果您不想使用預設值,請確保 innodb_data_file_pathinnodb_log_file_size 設定參數的設定在執行 mysqld之前就已在 MySQL 組態檔案中設定。另外,請務必根據需要指定其他會影響 InnoDB 檔案建立和位置的參數,例如 innodb_data_home_dirinnodb_log_group_home_dir

    如果您的組態檔案中有這些選項,但該檔案不在 MySQL 預設讀取的位置,請在執行 mysqld 時,使用 --defaults-extra-file 選項指定檔案位置。

  4. 伺服器會建立 '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 密碼分配

  5. 伺服器會填入用於 HELP 陳述式的伺服器端說明表格(請參閱第 15.8.3 節「HELP 陳述式」)。伺服器不會填入時區表格。若要手動執行此操作,請參閱第 7.1.15 節「MySQL 伺服器時區支援」

  6. 如果 init_file 系統變數被指定為 SQL 陳述式的檔案名稱,伺服器會執行檔案中的陳述式。此選項可讓您執行自訂的開機順序。

    當伺服器在開機模式下運作時,某些功能無法使用,這會限制檔案中允許的陳述式。這些包括與帳戶管理(例如 CREATE USERGRANT)、複寫和全域交易識別碼相關的陳述式。

  7. 伺服器會結束。

初始化後的 root 密碼分配

在您使用 --initialize--initialize-insecure 啟動伺服器來初始化資料目錄之後,請正常啟動伺服器(也就是說,不使用其中任何一個選項),並為 'root'@'localhost' 帳戶分配一個新密碼

  1. 啟動伺服器。如需說明,請參閱第 2.9.2 節「啟動伺服器」

  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
  3. 連線後,使用 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=::1root 身分連線,請建立這些帳戶。

CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY 'root-password';
CREATE USER 'root'@'::1' IDENTIFIED BY 'root-password';

可以將這些陳述式放入檔案中,以便使用 init_file 系統變數來執行,如 資料目錄初始化期間的伺服器動作 中所述。