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 有影響,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 ONLYmysql> SET sql_log_bin = OFF; mysql> ALTER DATABASE mydb READ ONLY = 1;傾印資料庫,例如使用 mysqldump
$> mysqldump --databases mydb > mydb.sql在單一工作階段中,停用二進制日誌並為資料庫停用
READ ONLYmysql> SET sql_log_bin = OFF; mysql> ALTER DATABASE mydb READ ONLY = 0;