1 ALTER FUNCTION
语句
ALTER FUNCTION
语句在 SQL 中用于修改已存在的函数。然而,需要注意的是,并非所有的数据库系统都支持直接通过 ALTER FUNCTION
语句来修改函数的定义。在一些数据库系统中,如 MySQL,一旦函数被创建,你就不能直接修改它;相反,你需要先删除旧的函数,然后创建一个新的函数来替换它。但在其他数据库系统(如 SQL Server)中,ALTER FUNCTION
语句被用来修改函数的定义。
在 SQL Server 中,ALTER FUNCTION
语句允许你修改已存在的标量函数、内联表值函数或多语句表值函数的定义。以下是一个修改标量函数的基本语法示例:
ALTER FUNCTION func_name [characteristic ...]
characteristic: {
COMMENT 'string'
| LANGUAGE SQL
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
}
此语句可用于更改存储函数的特性。在ALTER FUNCTION语句中可以指定多个更改。但是,不能使用此语句更改存储函数的参数或主体;要进行这样的更改,必须使用drop function和create function删除并重新创建函数。
必须具有该函数的ALTER ROUTINE权限。(该权限自动授予函数创建者。)如果启用了二进制日志记录,ALTER function语句可能还需要SUPER权限。
2 ALTER INSTANCE语句
在数据库系统中,ALTER INSTANCE
并不是一个广泛支持或标准的 SQL 语句。实际上,ALTER INSTANCE
的存在和用法高度依赖于特定的数据库管理系统(DBMS)。例如,在 Oracle 数据库中,并没有直接的 ALTER INSTANCE
SQL 语句用于修改数据库实例的配置。相反,Oracle 使用动态性能视图(如 V$PARAMETER
)和 SQL*Plus 或其他工具来动态地更改实例参数,这些操作通常通过执行 ALTER SYSTEM
语句来完成。
然而,在某些上下文中,如 Microsoft SQL Server 的某些早期版本或特定于某个应用场景的数据库系统中,可能会遇到 ALTER INSTANCE
或类似名称的语句或命令。但请注意,这些通常不是 SQL 标准的一部分,而是特定于该数据库系统的扩展或特定于版本的特性。
以下是一个基本语法示例:
ALTER INSTANCE instance_action
instance_action: {
| {ENABLE|DISABLE} INNODB REDO_LOG
| ROTATE INNODB MASTER KEY
| ROTATE BINLOG MASTER KEY
| RELOAD TLS
[FOR CHANNEL {mysql_main | mysql_admin}]
[NO ROLLBACK ON ERROR]
| RELOAD KEYRING
}
ALTER INSTANCE定义适用于MySQL服务器实例的操作。该声明支持以下操作:
- ALTER INSTANCE{ENABLE | DISABLE}INNODB REDO_LOG
此操作启用或禁用InnoDB重做日志记录。恢复日志记录在默认情况下处于启用状态。此功能仅用于将数据加载到新的MySQL实例中。该语句未写入二进制日志。此操作是在MySQL 8.0.21中引入的。
警告
不要在生产系统上禁用重做日志记录。虽然允许在禁用重做日志记录时关闭和重新启动服务器,但在禁用重做记录记录时服务器意外停止可能会导致数据丢失和实例损坏。
ALTER INSTANCE [ENABLE | DISABLE] INNODB REDO_LOG操作需要一个独占备份锁,这将阻止其他ALTER INSTANCE操作同时执行。其他ALTER INSTANCE操作必须等待锁释放后才能执行。
- ALTER INSTANCE ROTATE INNODB MASTER KEY
此操作旋转(更换)用于InnoDB表空间加密的主加密密钥。密钥旋转(更换)需要ENCRYPTION_Key_ADMIN或SUPER权限。要执行此操作,必须安装并配置密钥环插件。
ALTER INSTANCE ROTATE INNODB MASTER KEY支持并发DML。当在数据库中执行与加密相关的操作时,如CREATE TABLE ... ENCRYPTION
或ALTER TABLE ... ENCRYPTION
,这些操作通常是独占性的,意味着它们不能与其他可能修改表结构或加密状态的操作并发执行。这是为了确保数据的一致性和完整性,防止因为并发执行而导致的冲突或数据损坏。
在执行这些加密操作时,数据库会采取锁定机制来防止其他用户或进程修改正在被加密的表。这些锁定可以是表级锁、行级锁或其他类型的锁,具体取决于数据库的实现和配置。
如果其中一个冲突语句正在运行,则必须先完成该语句,然后才能继续执行另一个语句。
ALTER INSTANCE ROTATE INNODB MASTER KEY语句被写入二进制日志,以便可以在服务器副本上执行。
- ALTER INSTANCE ROTATE BINLOG MASTER KEY
此操作旋转(更换)用于二进制日志加密的二进制日志主密钥。二进制日志主密钥的密钥轮换需要BINLOG_ENCRYPTION_ADMIN或SUPER权限。如果binlog_encryption系统变量设置为OFF,则无法使用该语句。若要执行此操作,必须安装并配置密钥环插件。
ALTER INSTANCE ROTATE BINLOG MASTER KEY操作不会写入二进制日志,也不会在副本上执行。因此,二进制日志主密钥轮换可以在包括混合MySQL版本的复制环境中执行。要计划在所有适用的源服务器和副本服务器上定期轮换二进制日志主密钥,可以在每台服务器上启用MySQL事件调度程序,并使用CREATE Event语句发出ALTER INSTANCE ROTATE BINLOG master key语句。如果您因为怀疑当前或以前的任何二进制日志主密钥可能已被泄露而轮换二进制日志主关键字,请在每个适用的源和副本服务器上发出声明,这样您就可以验证是否立即符合要求。
- ALTER INSTANCE RELOAD TLS
此操作根据定义上下文的系统变量的当前值重新配置TLS上下文。它还更新反映活动上下文值的状态变量。此操作需要CONNECTION_ADMIN权限。
默认情况下,该语句会重新加载主连接接口的TLS上下文。如果给定了FOR CHANNEL子句(从MySQL 8.0.21起可用),则该语句将重新加载命名通道的TLS上下文:MySQL_main用于主连接接口,MySQL_admin用于管理连接接口。
更新主接口的TLS上下文也可能影响管理接口,因为除非为该接口配置了某些非默认TLS值,否则它将使用与主接口相同的TLS上下文。
注意:
重新加载TLS上下文时,作为过程的一部分,OpenSSL会重新加载包含CRL(证书吊销列表)的文件。如果CRL文件很大,服务器会分配一大块内存(文件大小的十倍),当新实例正在加载而旧实例尚未释放时,内存会翻倍。释放大量分配后,进程驻留内存不会立即减少,因此,如果对大型CRL文件重复发出ALTER INSTANCE RELOAD TLS语句,则进程驻留内存的使用量可能会因此而增加。
默认情况下,RELOAD TLS操作会返回一个错误,如果配置值不允许创建新的TLS上下文,则该操作无效。以前的上下文值将继续用于新连接。如果给定了可选的NO ROLLBACK ON ERROR子句,并且无法创建新上下文,则不会发生回滚。相反,会生成一个警告,并对应用该语句的接口上的新连接禁用加密。
ALTER INSTANCE RELOAD TLS语句不会写入二进制日志(因此不会被复制)。TLS配置是本地的,并且取决于本地文件,而不一定存在于所有涉及的服务器上。
- ALTER INSTANCE RELOAD KEYRING
如果安装了密匙环组件,则此操作“告知”该组件重新加载其配置文件并重新初始化内存中的任何密匙环数据。如果在运行时修改组件配置,则在执行此操作之前,新配置不会生效。重新加载密钥环需要ENCRYPTION_KEY_ADMIN权限。此操作是在MySQL 8.0.24中添加的。
此操作仅允许重新配置当前安装的钥匙圈组件。它不允许更改安装的组件。例如,如果更改已安装的密钥环组件的配置,ALTER INSTANCE RELOAD keyring会使新配置生效。另一方面,如果更改服务器清单文件中命名的密钥环组件,ALTER INSTANCE RELOAD keyring将无效,并且当前组件仍处于安装状态。
ALTER INSTANCE RELOAD KEYRING语句不会写入二进制日志(因此不会被复制)。