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.18, «Команды CREATE PROCEDURE и CREATE FUNCTION».) Если вы измените кодировку символов или сортировку по умолчанию для базы данных, любые хранимые процедуры, которые должны использовать новые параметры, необходимо удалить и создать заново.
Параметр шифрования
Параметр ENCRYPTION определяет шифрование по умолчанию для базы данных, которое наследуется таблицами, созданными в базе данных. Разрешенные значения — 'Y' (шифрование включено) и 'N' (шифрование выключено).
Схема системной базы данных mysql не может быть установлена по умолчанию для шифрования. Существующие таблицы в ней являются частью общего табличного пространства mysql, которое может быть зашифровано. information_schema содержит только представления. В ней нельзя создавать таблицы. Нет ничего на диске, что нужно зашифровать. Все таблицы в performance_schema используют движок PERFORMANCE_SCHEMA, который полностью находится в оперативной памяти. Невозможно создать другие таблицы в нем. Нет ничего на диске, что нужно зашифровать.
Только вновь созданные таблицы наследуют шифрование по умолчанию базы данных. Для существующих таблиц, связанных с базой данных, их шифрование остается неизменным. Если системная переменная table_encryption_privilege_check включена, для указания настройки шифрования по умолчанию, отличной от значения системной переменной default_table_encryption, требуется привилегия TABLE_ENCRYPTION_ADMIN. Дополнительные сведения см. в Определении шифрования по умолчанию для схем и общих табличных пространств.
Параметр только для чтения
Параметр READ ONLY управляет тем, разрешено ли изменение базы данных и объектов в ней. Разрешенные значения — DEFAULT или 0 (не только для чтения) и 1 (только для чтения). Этот параметр полезен для миграции баз данных, поскольку для базы данных, для которой READ ONLY включен, можно мигрировать на другой экземпляр MySQL без опасений, что база данных может быть изменена во время операции.
В NDB Cluster, установка базы данных только для чтения на одном сервере mysqld синхронизируется с другими серверами mysqld в одном кластере, так что база данных становится только для чтения на всех серверах mysqld.
Параметр READ ONLY, если он включен, отображается в таблице INFORMATION_SCHEMA SCHEMATA_EXTENSIONS. См. Раздел 28.3.34, «Таблица 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 Cluster.
Помимо перечисленных выше исключений, включение параметра 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.