文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手冊頁 (TGZ) - 258.2Kb
手冊頁 (Zip) - 365.3Kb
資訊 (Gzip) - 4.0Mb
資訊 (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  ALTER DATABASE 語句

15.1.2 ALTER DATABASE 語句

ALTER {DATABASE | SCHEMA} [db_name]
    alter_option ...

alter_option: {
    [DEFAULT] CHARACTER SET [=] charset_name
  | [DEFAULT] COLLATE [=] collation_name
  | [DEFAULT] ENCRYPTION [=] {'Y' | 'N'}
  | READ ONLY [=] {DEFAULT | 0 | 1}
}

ALTER DATABASE 讓您能夠變更資料庫的整體特性。這些特性儲存在資料字典中。此陳述式需要資料庫的 ALTER 權限。ALTER SCHEMAALTER DATABASE 的同義詞。

如果省略資料庫名稱,則此陳述式會套用至預設資料庫。在這種情況下,如果沒有預設資料庫,則會發生錯誤。

對於陳述式中省略的任何 alter_option,資料庫會保留其目前的選項值,但變更字元集可能會變更校對,反之亦然。

字元集和校對選項

CHARACTER SET 選項會變更預設資料庫字元集。COLLATE 選項會變更預設資料庫校對。如需字元集和校對名稱的相關資訊,請參閱第 12 章,字元集、校對、Unicode

若要查看可用的字元集和校對,請分別使用 SHOW CHARACTER SETSHOW COLLATION 陳述式。請參閱第 15.7.7.4 節,〈SHOW CHARACTER SET 陳述式〉第 15.7.7.5 節,〈SHOW COLLATION 陳述式〉

當建立預存常式時,使用資料庫預設值的預存常式會將這些預設值納入其定義中。(在預存常式中,如果未明確指定字元集或校對,具有字元資料類型的變數會使用資料庫預設值。請參閱第 15.1.17 節,〈CREATE PROCEDURE 和 CREATE FUNCTION 陳述式〉。)如果您變更資料庫的預設字元集或校對,則必須刪除並重新建立任何要使用新預設值的預存常式。

加密選項

ENCRYPTION 選項會定義預設資料庫加密,該加密會由在資料庫中建立的資料表繼承。允許的值為 'Y' (已啟用加密) 和 'N' (已停用加密)。

mysql 系統結構描述無法設定為預設加密。其中的現有資料表是通用 mysql 表空間的一部分,該表空間可能會加密。information_schema 僅包含檢視。無法在其中建立任何資料表。磁碟上沒有任何東西需要加密。performance_schema 中的所有資料表都使用PERFORMANCE_SCHEMA 引擎,該引擎純粹在記憶體中。無法在其中建立任何其他資料表。磁碟上沒有任何東西需要加密。

只有新建立的資料表會繼承預設資料庫加密。對於與資料庫相關聯的現有資料表,其加密保持不變。如果啟用table_encryption_privilege_check系統變數,則需要 TABLE_ENCRYPTION_ADMIN 權限才能指定與 default_table_encryption 系統變數值不同的預設加密設定。如需更多資訊,請參閱定義結構描述和通用表空間的加密預設值

唯讀選項

READ ONLY 選項控制是否允許修改資料庫及其中的物件。允許的值為 DEFAULT0 (非唯讀) 和 1 (唯讀)。此選項對於資料庫移轉很有用,因為已啟用 READ ONLY 的資料庫可以移轉到另一個 MySQL 執行個體,而不必擔心該資料庫在作業期間可能會變更。

使用 NDB Cluster 時,在一個 mysqld 伺服器上將資料庫設為唯讀會同步到同一個叢集中的其他 mysqld 伺服器,以便資料庫在所有 mysqld 伺服器上變成唯讀。

如果啟用 READ ONLY 選項,則會在 INFORMATION_SCHEMA SCHEMATA_EXTENSIONS 資料表中顯示。請參閱第 28.3.32 節,〈INFORMATION_SCHEMA SCHEMATA_EXTENSIONS 資料表〉

無法為以下系統結構描述啟用 READ ONLY 選項:mysqlinformation_schemaperformance_schema

ALTER DATABASE 陳述式中,READ ONLY 選項會與其自身的其他執行個體和其他選項互動,如下所示

  • 如果 READ ONLY 的多個執行個體發生衝突 (例如,READ ONLY = 1 READ ONLY = 0),則會發生錯誤。

  • 即使是唯讀資料庫,也允許包含僅 (不衝突) READ ONLY 選項的 ALTER DATABASE 陳述式。

  • 如果資料庫在陳述式之前或之後的唯讀狀態允許修改,則允許將 (不衝突) READ ONLY 選項與其他選項混合使用。如果陳述式之前和之後的唯讀狀態都禁止變更,則會發生錯誤。

    無論資料庫是否為唯讀,此陳述式都會成功

    ALTER DATABASE mydb READ ONLY = 0 DEFAULT COLLATE utf8mb4_bin;

    如果資料庫不是唯讀,則此陳述式會成功,但如果資料庫已是唯讀,則會失敗

    ALTER DATABASE mydb READ ONLY = 1 DEFAULT COLLATE utf8mb4_bin;

啟用 READ ONLY 會影響資料庫的所有使用者,但下列例外情況不受唯讀檢查的限制

  • 伺服器在伺服器初始化、重新啟動、升級或複寫期間執行的陳述式。

  • 在伺服器啟動時由 init_file 系統變數命名的檔案中的陳述式。

  • TEMPORARY 資料表;可以在唯讀資料庫中建立、變更、刪除和寫入 TEMPORARY 資料表。

  • NDB Cluster 非 SQL 插入和更新。

除了剛剛列出的例外作業之外,啟用 READ ONLY 會禁止對資料庫及其物件進行寫入作業,包括其定義、資料和中繼資料。以下清單詳細說明了受影響的 SQL 陳述式和作業

  • 資料庫本身

  • 檢視

    • CREATE VIEW

    • ALTER VIEW

    • DROP VIEW

    • 從具有副作用的函式叫用的檢視中選取。

    • 更新可更新的檢視。

    • 如果陳述式影響唯讀資料庫中檢視的中繼資料 (例如,使檢視有效或無效),則會拒絕在可寫入資料庫中建立或刪除物件的陳述式。

  • 預存常式

    • CREATE PROCEDURE

    • DROP PROCEDURE

    • CALL (具有副作用的程序)

    • CREATE FUNCTION

    • DROP FUNCTION

    • SELECT (具有副作用的函式)

    • 對於程序和函式,唯讀檢查遵循預鎖定行為。對於 CALL 陳述式,唯讀檢查是在每個陳述式的基礎上進行的,因此如果某些條件式執行的陳述式寫入唯讀資料庫實際上沒有執行,則呼叫仍然會成功。另一方面,對於在 SELECT 中呼叫的函式,函式主體的執行會在預鎖定模式下發生。只要函式中的某些陳述式寫入唯讀資料庫,無論陳述式是否實際執行,函式的執行都會失敗並出現錯誤。

  • 觸發程序

  • 事件

    • CREATE EVENT

    • ALTER EVENT

    • DROP EVENT

    • 事件執行

      • 在資料庫中執行事件會失敗,因為這會變更上次執行時間戳記,這是儲存在資料字典中的事件中繼資料。事件執行失敗也會導致事件排程器停止。

      • 如果事件寫入唯讀資料庫中的物件,則事件的執行會失敗並出現錯誤,但事件排程器不會停止。

  • 資料表

    • CREATE TABLE

    • ALTER TABLE

    • CREATE INDEX

    • DROP INDEX

    • RENAME TABLE

    • TRUNCATE TABLE

    • DROP TABLE

    • DELETE

    • INSERT

    • IMPORT TABLE

    • LOAD DATA

    • LOAD XML

    • REPLACE

    • UPDATE

    • 對於子資料表位於唯讀資料庫中的串聯外來索引鍵,即使子資料表未直接受到影響,也會拒絕對父系的更新和刪除。

    • 對於 MERGE 資料表 (例如 CREATE TABLE s1.t(i int) ENGINE MERGE UNION (s2.t, s3.t), INSERT_METHOD=...),適用以下行為

      • 如果 s1s2s3 中至少有一個是唯讀,則無論插入方法為何,將資料插入 MERGE 資料表 (INSERT into s1.t) 都會失敗。即使插入實際上會進入可寫入資料表,也會拒絕插入。

      • 只要 s1 不是唯讀,刪除 MERGE 資料表 (DROP TABLE s1.t) 就會成功。允許刪除參照唯讀資料庫的 MERGE 資料表。

ALTER DATABASE 陳述式會封鎖,直到所有已存取正在變更的資料庫中物件的並行交易都已認可。相反地,存取正在並行 ALTER DATABASE 中變更的資料庫中物件的寫入交易會封鎖,直到 ALTER DATABASE 已認可。

如果使用 Clone 外掛程式複製本機或遠端資料目錄,則複製中的資料庫會保留其在來源資料目錄中擁有的唯讀狀態。唯讀狀態不會影響複製程序本身。如果不希望複製中的資料庫具有相同的唯讀狀態,則必須在複製程序完成後,使用複製上的 ALTER DATABASE 作業來明確變更該選項。

當從捐贈者複製到接收者時,如果接收者擁有唯讀的使用者資料庫,複製將會失敗並顯示錯誤訊息。在將資料庫改為可寫入後,可以重試複製。

READ ONLY 對於 ALTER DATABASE 是允許的,但對於 CREATE DATABASE 則不允許。然而,對於唯讀資料庫,SHOW CREATE DATABASE 產生的語句會在註解中包含 READ ONLY=1,以表示其唯讀狀態。

mysql> ALTER DATABASE mydb READ ONLY = 1;
mysql> SHOW CREATE DATABASE mydb\G
*************************** 1. row ***************************
       Database: mydb
Create Database: CREATE DATABASE `mydb`
                 /*!40100 DEFAULT CHARACTER SET utf8mb4
                          COLLATE utf8mb4_0900_ai_ci */
                 /*!80016 DEFAULT ENCRYPTION='N' */
                 /* READ ONLY = 1 */

如果伺服器執行包含此類註解的 CREATE DATABASE 語句,伺服器會忽略該註解,並且不會處理 READ ONLY 選項。這對 mysqldump 有影響,因為它使用 SHOW CREATE DATABASE 來在傾印輸出中產生 CREATE DATABASE 語句。

  • 在傾印檔案中,唯讀資料庫的 CREATE DATABASE 語句包含註解的 READ ONLY 選項。

  • 可以像平常一樣還原傾印檔案,但是因為伺服器忽略了註解的 READ ONLY 選項,所以還原後的資料庫不是唯讀的。如果資料庫在還原後要設為唯讀,您必須手動執行 ALTER DATABASE 才能將其設為唯讀。

假設 mydb 是唯讀的,您按如下方式傾印它

$> mysqldump --databases mydb > mydb.sql

稍後的還原操作必須接著執行 ALTER DATABASE,如果 mydb 應保持唯讀狀態。

$> mysql
mysql> SOURCE mydb.sql;
mysql> ALTER DATABASE mydb READ ONLY = 1;

MySQL Enterprise Backup 不受此問題影響。它可以像備份和還原其他資料庫一樣備份和還原唯讀資料庫,但在還原時,如果備份時啟用了 READ ONLY 選項,則會啟用它。

ALTER DATABASE 會寫入二進制日誌,因此在複寫來源伺服器上對 READ ONLY 選項的更改也會影響複本。為了避免這種情況發生,必須在執行 ALTER DATABASE 語句之前停用二進制日誌。例如,為了準備遷移資料庫而不影響複本,請執行以下操作:

  1. 在單一會話中,停用二進制日誌並啟用資料庫的 READ ONLY

    mysql> SET sql_log_bin = OFF;
    mysql> ALTER DATABASE mydb READ ONLY = 1;
  2. 傾印資料庫,例如使用 mysqldump

    $> mysqldump --databases mydb > mydb.sql
  3. 在單一會話中,停用二進制日誌並停用資料庫的 READ ONLY

    mysql> SET sql_log_bin = OFF;
    mysql> ALTER DATABASE mydb READ ONLY = 0;