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 SCHEMA
是 ALTER DATABASE
的同義詞。
如果省略資料庫名稱,則此陳述式會套用至預設資料庫。在這種情況下,如果沒有預設資料庫,則會發生錯誤。
對於陳述式中省略的任何 alter_option
,資料庫會保留其目前的選項值,但變更字元集可能會變更校對,反之亦然。
字元集和校對選項
CHARACTER SET
選項會變更預設資料庫字元集。COLLATE
選項會變更預設資料庫校對。如需字元集和校對名稱的相關資訊,請參閱第 12 章,字元集、校對、Unicode。
若要查看可用的字元集和校對,請分別使用 SHOW CHARACTER SET
和 SHOW 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
選項控制是否允許修改資料庫及其中的物件。允許的值為 DEFAULT
或 0
(非唯讀) 和 1
(唯讀)。此選項對於資料庫移轉很有用,因為已啟用 READ ONLY
的資料庫可以移轉到另一個 MySQL 執行個體,而不必擔心該資料庫在作業期間可能會變更。
使用 NDB Cluster 時,在一個 mysqld 伺服器上將資料庫設為唯讀會同步到同一個叢集中的其他 mysqld 伺服器,以便資料庫在所有 mysqld 伺服器上變成唯讀。
如果啟用 READ ONLY
選項,則會在 INFORMATION_SCHEMA
SCHEMATA_EXTENSIONS
資料表中顯示。請參閱第 28.3.32 節,〈INFORMATION_SCHEMA SCHEMATA_EXTENSIONS 資料表〉。
無法為以下系統結構描述啟用 READ ONLY
選項:mysql
、information_schema
、performance_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 陳述式和作業
資料庫本身
ALTER DATABASE
(但變更READ ONLY
選項除外)
檢視
從具有副作用的函式叫用的檢視中選取。
更新可更新的檢視。
如果陳述式影響唯讀資料庫中檢視的中繼資料 (例如,使檢視有效或無效),則會拒絕在可寫入資料庫中建立或刪除物件的陳述式。
預存常式
觸發程序
觸發程序叫用。
事件
事件執行
在資料庫中執行事件會失敗,因為這會變更上次執行時間戳記,這是儲存在資料字典中的事件中繼資料。事件執行失敗也會導致事件排程器停止。
如果事件寫入唯讀資料庫中的物件,則事件的執行會失敗並出現錯誤,但事件排程器不會停止。
資料表
對於子資料表位於唯讀資料庫中的串聯外來索引鍵,即使子資料表未直接受到影響,也會拒絕對父系的更新和刪除。
對於
MERGE
資料表 (例如CREATE TABLE s1.t(i int) ENGINE MERGE UNION (s2.t, s3.t), INSERT_METHOD=...
),適用以下行為如果
s1
、s2
、s3
中至少有一個是唯讀,則無論插入方法為何,將資料插入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
語句之前停用二進制日誌。例如,為了準備遷移資料庫而不影響複本,請執行以下操作:
在單一會話中,停用二進制日誌並啟用資料庫的
READ ONLY
mysql> SET sql_log_bin = OFF; mysql> ALTER DATABASE mydb READ ONLY = 1;
傾印資料庫,例如使用 mysqldump
$> mysqldump --databases mydb > mydb.sql
在單一會話中,停用二進制日誌並停用資料庫的
READ ONLY
mysql> SET sql_log_bin = OFF; mysql> ALTER DATABASE mydb READ ONLY = 0;