10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 下载本手册
PDF(美国高级主任)- 41.2 mb
PDF (A4)- 41.3 mb
PDF (RPM)- 39.5 mb
HTML下载(TGZ)- 9.3 mb
HTML下载(Zip)- 9.3 mb
HTML下载(RPM)- 7.8 mb
手册页(TGZ)- 260.6 kb
手册页(Zip)- 371.8 kb
信息(Gzip)- 4.0 mb
信息(邮政编码)- 4.0 mb
本手册节选

13.1.2 ALTER DATABASE语句

修改数据库|模式db_namealter_option...alter_option:{[默认]字符集[=]charset_name|[默认值]collate [=]collation_name| [default] encryption [=] {' y ' | ' n '} | read only [=] {default | 0 | 1}}

修改数据库使您能够更改数据库的整体特征。这些特征存储在数据字典中。此语句要求改变数据库的权限。改变模式是同义词吗修改数据库

如果省略数据库名称,则该语句应用于默认数据库。在这种情况下,如果没有默认数据库,就会发生错误。

对于任何alter_option从语句中省略,数据库将保留其当前选项值,除非更改字符集可能更改排序规则,反之亦然。

字符集和排序规则选项

字符集选项更改默认数据库字符集。的核对选项更改默认数据库排序规则。有关字符集和排序规则名称的信息,请参见第十章,字符集,排序规则,Unicode

要查看可用的字符集和排序规则,请使用显示字符集而且显示排序分别陈述。看到第13.7.7.3节,“SHOW CHARACTER SET语句”,第13.7.7.4节,“SHOW COLLATION语句”

在创建例程时使用数据库默认值的存储例程将这些默认值作为其定义的一部分。(在存储例程中,如果没有显式指定字符集或排序规则,具有字符数据类型的变量将使用数据库默认值。看到第13.1.17节,CREATE PROCEDURE和CREATE FUNCTION语句)。如果更改数据库的默认字符集或排序规则,则必须删除并重新创建要使用新默认值的任何存储例程。

加密选项

加密选项,在MySQL 8.0.16中引入,定义了默认的数据库加密,它由数据库中创建的表继承。允许的值为“Y”(已启用加密)和“N”(加密禁用)。只有新创建的表继承默认的数据库加密。对于与数据库关联的现有表,它们的加密保持不变。如果table_encryption_privilege_check系统变量启用时,则TABLE_ENCRYPTION_ADMIN属性的值不同的默认加密设置需要使用特权default_table_encryption系统变量。有关更多信息,请参见为模式和通用表空间定义加密默认值

只读选项

只读选项,在MySQL 8.0.22引入,控制是否允许修改数据库和其中的对象。允许的值为默认的0(非只读)和1(只读)。此选项对于数据库迁移非常有用,因为数据库只读可以迁移到另一个MySQL实例,而不用担心在操作过程中数据库可能会被更改。

使用NDB集群,使数据库只在其中一个上读mysqld服务器同步到其他服务器mysqld同一集群中的服务器,这样数据库在所有服务器上都变成只读mysqld服务器。

只读选项,如果启用,将显示INFORMATION_SCHEMASCHEMATA_EXTENSIONS表格看到第26.3.32节,“INFORMATION_SCHEMA SCHEMATA_EXTENSIONS表”

只读选项不能为以下系统模式启用:mysqlinformation_schemaperformance_schema

修改数据库语句,只读选项与自身的其他实例以及与其他选项的交互方式如下:

  • 的多个实例将发生错误只读冲突(例如,只读= 1只读= 0).

  • 一个修改数据库只包含(非冲突)的语句只读Options甚至对于只读数据库也是允许的。

  • (不冲突)的混合只读如果在语句之前或之后数据库的只读状态允许修改,则允许使用带有其他选项的Options。如果之前和之后的只读状态都禁止更改,则会发生错误。

    无论数据库是否为只读,该语句都成功:

    ALTER DATABASE mydb READ ONLY = 0 DEFAULT COLLATE utf8mb4_bin;

    如果数据库不是只读的,该语句成功;如果数据库已经是只读的,该语句失败:

    ALTER DATABASE mydb READ ONLY = 1 DEFAULT COLLATE utf8mb4_bin;

启用只读影响数据库的所有用户,除了以下不受只读检查的例外:

  • 由服务器执行的语句,作为服务器初始化、重新启动、升级或复制的一部分。

  • 方法在服务器启动时命名的文件中的语句init_file系统变量。

  • 临时表;可以创建、修改、删除和写入临时只读数据库中的表。

  • NDB集群非sql插入和更新。

除了刚才列出的异常操作之外,启用只读禁止对数据库及其对象(包括它们的定义、数据和元数据)进行写操作。下面的列表细节会影响SQL语句和操作:

  • 数据库本身:

  • 视图:

    • 创建视图

    • 改变观点

    • 删除视图

    • 从调用带有副作用的函数的视图中进行选择。

    • 更新可更新的视图。

    • 在可写数据库中创建或删除对象的语句如果影响只读数据库中视图的元数据(例如,使视图有效或无效),则会被拒绝。

  • 存储程序:

    • 创建过程

    • 下降过程

    • 调用(指有副作用的手术)

    • 创建函数

    • 删除函数

    • 选择(指有副作用的功能)

    • 对于过程和函数,只读检查遵循预锁行为。为调用语句,只读检查是在每个语句的基础上进行的,因此如果一些有条件执行的语句写入只读数据库没有实际执行,调用仍然成功。类中调用的函数选择,函数体的执行以预锁定模式进行。只要函数中的某个语句写入只读数据库,函数的执行就会失败并报错,而不管该语句是否实际执行。

  • 触发器:

  • 事件:

    • 创建事件

    • 改变事件

    • 删除事件

    • 活动执行:

      • 在数据库中执行事件会失败,因为这会改变最后一次执行的时间戳,这是存储在数据字典中的事件元数据。事件执行失败还会导致事件调度器停止。

      • 如果事件写入只读数据库中的对象,则该事件的执行将失败并报错,但事件调度器不会停止。

  • 表:

    • 创建表

    • ALTER TABLE

    • 创建索引

    • 指数下降

    • 重命名表

    • 截断表

    • 删除表

    • 删除

    • 插入

    • 导入表

    • 加载数据

    • 加载XML

    • 取代

    • 更新

    • 对于级联外键,其中子表位于只读数据库中,即使子表没有直接受到影响,父表上的更新和删除也会被拒绝。

    • 对于一个合并表如创建表s1。t(i int) ENGINE MERGE UNION (s2.)t, s3.t), INSERT_METHOD=…,则适用以下行为:

      • 插入合并表(插入到s1.t)失败,如果至少一个s1s2s3无论插入方法如何,都是只读的。即使插入实际上是在可写表中,也会被拒绝。

      • 删除合并表(删除表s1.t)只要……就成功s1不是只读的。它被允许掉一个合并引用只读数据库的表。

一个修改数据库语句将阻塞,直到所有已经访问过正在修改的数据库中的对象的并发事务都已提交。相反,访问数据库中对象的写事务在并发中被修改修改数据库直到修改数据库已提交。

如果使用Clone插件克隆本地或远程数据目录,克隆中的数据库将保持源数据目录中的只读状态。只读状态不会影响克隆进程本身。如果不希望在克隆中具有相同的数据库只读状态,则必须在克隆过程结束后显式地为克隆更改该选项,使用修改数据库克隆操作。

当从一个捐赠者克隆到一个接收者时,如果接收者有一个只读的用户数据库,克隆会失败并报错。在使数据库可写后,可以重新尝试克隆。

只读是允许的修改数据库,但不是为了创建数据库.但是,对于只读数据库,生成的语句显示创建数据库包括只读= 1在注释中表示其只读状态:

mysql> ALTER DATABASE mydb READ ONLY = 1;mysql >显示创建数据库mydb \ G  *************************** 1。行  *************************** 数据库:数据库mydb创建:创建数据库mydb的/ * !默认字符集utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 default encryption =' n ' */ /* read only = 1 */

如果服务器执行创建数据库语句,则服务器将忽略该注释和只读选项未被处理。这意味着, mysqldump而且mysqlpump,使用显示创建数据库生产创建数据库dump输出中的语句:

  • 在转储文件中创建数据库语句包含已注释的只读选择。

  • 转储文件可以像往常一样恢复,但是由于服务器忽略了注释只读选项,则恢复的数据库为只读的。如果数据库恢复后还需要读取,则必须执行此操作修改数据库手动来实现。

假设mydb为只读,按如下方式转储:

Shell > mysqldump——数据库mydb > mydb.sql

后面的恢复操作必须跟随修改数据库如果mydb仍然只能读:

mysql> mysql>mysql> ALTER DATABASE mydb READ ONLY = 1;

MySQL企业备份不受此问题的影响。它像备份其他数据库一样备份和恢复只读数据库,但是启用只读选项(如果在备份时启用)。

修改数据库写入二进制日志,那么只读复制源服务器上的选项也会影响副本。方法的执行之前,必须禁用二进制日志记录修改数据库声明。例如,为了在不影响副本的情况下迁移数据库,需要执行以下操作:

  1. 在单个会话中,禁用二进制日志记录并启用只读对于数据库:

    mysql> SET sql_log_bin = OFF;mysql> ALTER DATABASE mydb READ ONLY = 1;
  2. 例如,转储数据库, mysqldumpmysqlpump

    Shell > mysqldump——数据库mydb > mydb.sql
  3. 在单个会话中,禁用二进制日志记录并禁用只读对于数据库:

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