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
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 (не только для чтения) и 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).Оператор
ALTER DATABASE, содержащий только (неконфликтные) параметрыREAD ONLY, разрешен даже для базы данных только для чтения.-
Смесь (неконфликтных) параметров
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в базе данных только для чтения.Вне-SQL вставки и обновления кластера NDB.
Помимо перечисленных выше исключений, включение параметра READ ONLY запрещает операции записи в базу данных и ее объекты, включая их определения, данные и метаданные. Следующий список содержит подробную информацию об операторах и операциях SQL, на которые это влияет:
-
Сама база данных:
ALTER DATABASE(кроме изменения параметраREAD ONLY)
-
Виды:
Выборка из представлений, вызывающих функции с побочными эффектами.
Обновление обновляемых представлений.
Запросы, создающие или удаляющие объекты в базе данных с записью, отклоняются, если они влияют на метаданные представления в базе данных только для чтения (например, делая представление допустимым или недопустимым).
-
Хранящиеся процедуры:
CALL(процедур с побочными эффектами)SELECT(функций с побочными эффектами)Для процедур и функций проверки только для чтения следуют поведению предварительной блокировки. Для операторов
CALLпроверки только для чтения выполняются на основе каждого оператора, поэтому, если некоторые условно выполненные операторы, записывающие в базу данных только для чтения, фактически не выполняются, вызов всё равно завершается успешно. С другой стороны, для функции, вызываемой в оператореSELECT, выполнение тела функции происходит в режиме предварительной блокировки. До тех пор, пока какой-либо оператор внутри функции записывает в базу данных только для чтения, выполнение функции завершается с ошибкой, независимо от того, действительно ли этот оператор выполняется.
-
Триггеры:
Вызов триггера.
-
События:
-
Выполнение события:
Выполнение события в базе данных завершается ошибкой, потому что это изменит отметку последнего выполнения, которая является метаданными события, хранящимися в словаре данных. Отказ от выполнения события также вызывает остановку планировщика событий.
Если событие записывает в объект в базе данных только для чтения, выполнение события завершается с ошибкой, но планировщик событий не останавливается.
-
Таблицы:
Для каскадных внешних ключей, где дочерняя таблица находится в базе данных только для чтения, обновления и удаления в родительской таблице отклоняются, даже если дочерняя таблица не затронута напрямую.
-
Для таблицы
MERGE, такой какCREATE TABLE s1.t(i int) ENGINE MERGE UNION (s2.t, s3.t), INSERT_METHOD=..., применяется следующее поведение:Вставка в таблицу
MERGE(INSERT into s1.t) завершается ошибкой, если хотя бы одна из таблицs1,s2,s3является только для чтения, независимо от метода вставки. Вставка отклоняется, даже если она фактически попала бы в таблицу с записью.Удаление таблицы
MERGE(DROP TABLE s1.t) успешно, еслиs1не является только для чтения. Разрешается удалить таблицу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, если база данных должна оставаться только для чтения:
$> 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;
© 2025 Oracle
Licensed under the GPLv2 License.