#ALTER SYSTEM
# 通用描述
ALTER SYSTEM用于动态地改变所在数据库实例(Instance)的属性,立即生效(但对于ALTER SYSTEM SET PARAMETER可设定为重启生效)且对所有用户生效。
# 语句定义
alter system::=
dump_clause::=
# set_parameter_clause
该语句用于修改数据库的配置参数。 ALTER SYSTEM SET修改配置参数,会打印修改信息的描述到RUN LOG中。 分布式部署中,仍更建议使用YCM图形化界面或者yasboot命令行方式来修改配置参数。
如果parameter_name为YashanDB规定的只读参数,执行此语句时将会提示YAS-02138错误。
YashanDB规定了如下几类配置参数:
- 只读参数,不可被修改。
- 允许被修改,且修改后可以立即生效的配置参数。
- 允许被修改,但修改后需要重启实例才会生效的配置参数。
Note:
在分布式集群中,执行本语句默认修改当前节点。
# scope
SCOPE用于设定对配置参数修改后的生效方式,默认为BOTH。
- spfile:将参数值写入磁盘,需重启才能生效
- memory:将参数值写入内存,立即生效,但重启后失效
- both:将参数值同时写入内存和磁盘,立即生效,重启后也生效
如果VALUE被赋予为YashanDB规定的不可立即生效参数,则必须同时指定SCOPE为SPFILE值,否则将会提示YAS-06001错误。
示例
SHOW PARAMETER data_buffer_size;
NAME VALUE
--------------------- -------
DATA_BUFFER_SIZE 64M
ALTER SYSTEM SET data_buffer_size=128M scope=spfile;
SHOW PARAMETER data_buffer_size;
NAME VALUE
--------------------- -------
DATA_BUFFER_SIZE 64M
SHOW PARAMETER checkpoint_timeout;
NAME VALUE
--------------------- -------
CHECKPOINT_TIMEOUT 300
ALTER SYSTEM SET checkpoint_timeout=400;
SHOW PARAMETER checkpoint_timeout;
NAME VALUE
--------------------- -------
CHECKPOINT_TIMEOUT 400
# type
本语句只在分布式部署中使用,用于指定节点类型进行配置。
- CN:修改所有CN节点配置参数
- DN:修改所有DN节点配置参数
- MN:修改所有MN节点配置参数
- ALL:修改所有节点配置参数,包括所有CN、DN和MN
如果不指定TYPE,默认修改本节点配置参数。
Note:
1.不允许在NOMOUNT/MOUNT模式下指定TYPE,默认修改本节点配置参数。
2.对于未处于OPEN状态的节点,即使处于TYPE指定范围内,也无法跨节点修改其配置参数。
3.上述描述的是连接到某一CN节点执行时的规则,如直连到其他节点,则不允许指定TYPE,默认修改本节点配置参数。
示例(分布式部署)
--修改所有CN节点上的RUN_LOG_FILE_COUNT
ALTER SYSTEM SET RUN_LOG_FILE_COUNT=200 SCOPE=BOTH TYPE = CN;
--修改所有DN节点上的RUN_LOG_FILE_COUNT
ALTER SYSTEM SET RUN_LOG_FILE_COUNT=200 SCOPE=BOTH TYPE = DN;
--修改所有MN节点上的RUN_LOG_FILE_COUNT
ALTER SYSTEM SET RUN_LOG_FILE_COUNT=200 SCOPE=BOTH TYPE = MN;
--修改所有CN、DN、MN节点上的RUN_LOG_FILE_COUNT
ALTER SYSTEM SET RUN_LOG_FILE_COUNT=200 SCOPE=BOTH TYPE = ALL;
# node
本语句只在分布式部署中使用,用于指定节点进行配置,node_id = g-n。
- g:节点所在组号ID
- n:节点ID,'*'表示组内所有节点
如果不指定NODE,默认修改本节点配置参数。
Note:
1.不允许在NOMOUNT/MOUNT模式下指定NODE,默认修改本节点配置参数。
2.对于未处于OPEN状态的节点,即使处于NODE指定范围内,也无法跨节点修改其配置参数。
3.上述描述的是连接到某一CN节点执行时的规则,如直连到其他节点,则不允许指定NODE,默认修改本节点配置参数。
示例(分布式部署)
--修改MN节点1-1上的RUN_LOG_FILE_COUNT
ALTER SYSTEM SET RUN_LOG_FILE_COUNT=200 SCOPE=BOTH NODE = 1-1;
--修改所有CN节点上的RUN_LOG_FILE_COUNT
ALTER SYSTEM SET RUN_LOG_FILE_COUNT=200 SCOPE=BOTH NODE = 2-*;
# switch logfile
该语句用于对数据库触发一次当前redo日志文件的强制切换,该操作不是进行归档的触发条件。
示例
ALTER SYSTEM SWITCH LOGFILE;
# checkpoint
该语句用于对数据库触发一次全量的CHECKPOINT,以使内存中的脏数据写入到磁盘中。
示例
ALTER SYSTEM CHECKPOINT;
# flush buffer_cache
该语句用于对数据库触发一次失效Buffer Cache中所有的Blocks,此操作会导致所有缓存数据被清除,其后的SQL查询将执行物理读取磁盘数据。分布式部署中不可使用本语句。
示例(单机、共享集群部署)
ALTER SYSTEM FLUSH BUFFER_CACHE;
# flush shared_pool
该语句用于对数据库触发一次回收失效的pool内存资源,此操作会导致长期未使用的SQL语句缓存被清空,其后的相同的SQL语句使用将重新进行编译解析。分布式部署中不可使用本语句。
示例(单机、共享集群部署)
ALTER SYSTEM FLUSH SHARED_POOL;
# extend buffer_cache size
该语句用于临时扩展数据库的Data Buffer大小,重启后失效。分布式部署中不可使用本语句。
# size_clause
对Data Buffer指定一个整型值,单位可以为B/K/M/G/T/P/E。每次运行该语句所设定SIZE的限额受如下两个值制约:
- 所在服务器的物理内存
- 2^24*DB_BLOCK_SIZE*DATA_BUFFER_PARTS
其中,DATA_BUFFER_PARTS表示Data Buffer的分区数,系统默认为1,如需调整该值,请联系我们的技术支持处理。
超过限定值将会提示YAS-00101错误。
示例(单机、共享集群部署)
ALTER SYSTEM EXTEND BUFFER_CACHE SIZE 4G;
# archive log current
该语句用于对数据库触发一次当前redo日志文件的切换和归档。此操作需要数据库的归档模式需处于开启状态,否则将提示YAS-02079错误。
示例
ALTER SYSTEM ARCHIVE LOG CURRENT;
# kill_session_clause
该语句用于终止一个指定的会话,并回滚(Rollback)此会话中未提交事务,释放此会话产生的锁(Lock),之后在此会话中运行SQL语句将提示连接错误信息。
执行此命令需提供会话的SID和SERIAL#。
示例(单机/共享集群部署)
-- 在sales用户下执行如下语句
SELECT area_no,area_name,DHQ FROM area WHERE area_no='01' FOR UPDATE;
-- 查看锁及会话信息
SELECT SID,ID1,ID2,LMODE,REQUEST FROM V$LOCK;
SID ID1 ID2 LMODE REQUEST
-------- --------------- ---------- --------- ---------
21 1328 TS
21 21474844928 0 ROW
SELECT sid,serial# FROM V$SESSION WHERE sid=21;
SID SERIAL#
-------- ------------
21 2
-- 以下操作需要拥有管理员权限
-- 通过SID和SERIAL#参数终止指定会话
ALTER SYSTEM KILL SESSION '21,2';
分布式跨CN会话终止
在配置了多CN的分布式环境中,可使用本语句跨CN终止指定的客户端连接会话,且仅支持通过GLOBAL_SESSION_ID指定相应会话。
GLOBAL_SESSION_ID(即分布式部署中的全局会话ID)可通过USERENV函数或查询DV$SESSION视图获取。在具有相同GLOBAL_SESSION_ID的会话集中有且仅有1个会话连接客户端与服务端CN节点,其他则为服务端各节点间的内部会话(其生存周期与客户端连接会话同步),关于会话的详细内容可参考会话管理。
示例(在配置了2-1和2-2两个CN节点的分布式环境中)
--连接2-1,建立一个会话,查看此会话的全局会话ID
--使用USERENV函数查询时使用GSID参数
SELECT USERENV('GSID') FROM dual;
USERENV('GSID')
--------------
131091
--获取连接到指定CN节点的会话标识,CN节点以group_id和group_node_id为唯一标识
SELECT global_session_id, serial#
FROM DV$SESSION WHERE global_session_id IN (131091) AND group_id=2 AND group_node_id=1;
GLOBAL_SESSION_ID SERIAL#
----------------- ------------
131091 5
--连接2-2,不要关闭2-1的会话,在2-2上终止2-1的会话
ALTER SYSTEM KILL SESSION '131091,5';
# cancel_sql_clause
该语句用于终止一个正在运行中的SQL操作,执行此命令需要提供该SQL操作所在会话的SID和SERIAL#。
指定SQL_ID时表示终止该SQL_ID对应的SQL操作,不指定时则表示终止该会话下当前正在运行的SQL操作。
在分布式下,支持跨CN终止SQL操作,需提供会话的GSID和SERIAL#。
示例(单机、共享集群部署):会话1——在sales用户下执行如下语句:
SELECT area_no,area_name,DHQ FROM area WHERE area_no='01' FOR UPDATE;
示例(单机、共享集群部署):会话2——在sales用户下执行如下语句:
--开启新会话2,以sales用户登录,添加等锁SQL,使其处于执行状态中
UPDATE area SET DHQ='Shanghai3' WHERE area_no='01';
示例(单机、共享集群部署):会话3——在DBA权限用户下执行如下语句:
--开启新会话3,以DBA权限用户登录
SELECT SID,ID1,ID2,LMODE,REQUEST FROM V$LOCK WHERE request='ROW';
SID ID1 ID2 LMODE REQUEST
-------- -------------- --------- --------- ---------
21 4447535124 ROW
--查询SQL_ID
SELECT sid,serial#,sql_id FROM V$SESSION WHERE sid=21;
SID SERIAL# SQL_ID
-------- ------------ ---------------------
21 1 3829447373
--终止指定的SQL
ALTER SYSTEM CANCEL SQL '21,1,3829447373';
--终止正在运行的SQL
ALTER SYSTEM CANCEL SQL '21,1';
在分布式环境中,上述会话1和会话2在cn2-1上执行,会话3操作在cn2-2上执行,即可实现跨CN终止SQL。
# ignore standby mismatched redo
该语句用于忽略备库与主库的不匹配的redo日志,使备库从redo日志分歧点继续接收主库日志。此操作前提是备库状态处于REDO MISMATCH,处于该状态的备库无法接收主库日志。分布式部署中不可使用本语句。
示例(单机、共享集群部署)
ALTER SYSTEM IGNORE STANDBY MISMATCHED REDO;
# dump_clause
该语句用于将YashanDB内部的信息转储(dump)到跟踪(trace)文件中,供用户进行分析和判断故障。
dump
用户在dump操作中指定某类内部信息,当前会话中的该类信息就被转储到trace文件中。
每一次dump操作在trace文件中产生一段信息,一个会话中可以多次执行dump操作。
trace
trace文件在会话首次执行dump时创建,文件存放在{YASDB_DATA}/diag/trace中,文件名称为{dbname}yas{sid}.trc。
trace文件被创建后,后续该会话中所有被dump的信息都被写入该文件。
当会话ID被复用时,sid对应的trace文件也将被复用,不会创建新的trace文件。
# private log
将当前会话的私有日志信息dump到trace文件中。执行此类信息的dump要求数据库处于mount或open状态。
# logfile
将某个日志文件的页面信息dump到trace文件中。执行此类信息的dump要求数据库处于mount或open状态。
本操作会对日志文件加锁,多个会话同时dump同一个日志文件时会形成锁等待。
当dump的logfile中的某个group是关于加密表空间上的页面记录时,这些group会受到保护,不会解析。
file_name
日志名称,为V$LOGFILE视图中存在的某个日志名称。
# datafile
将某个数据文件的页面信息dump到trace文件中。执行此类信息的dump要求数据库处于mount或open状态。
本操作会对数据文件加锁,多个会话同时dump同一个数据文件时会形成锁等待。
当dump加密表空间的数据文件某些页面或整个数据文件时,这些页面会受到保护,不会解析。
当页面在缓存中存在时,会dump内存信息和页面信息,反之则只会dump页面信息。
file_id
指定数据文件的ID,该值为数据文件的全局ID,即在V$DATAFILE视图中的ID字段值。
block_id
指定数据文件内的页面ID:
- 不指定BLOCK:dump所有页面。
- BLOCK block_id:指定一个页面。
- MINBLOCK block_id [MAXBLOCK block_id]:指定一批页面。必须同时指定MINBLOCK和MAXBLOCK,否则会报错。
- 指定一批页面时,MAXBLOCK小于MINBLOCK或MAXBLOCK超出文件大小均会报错。
# session backtrace
将指定会话的当前堆栈信息dump到trace文件中。执行此类信息的dump要求数据库处于mount或open状态。
本操作不允许并发,同一时间只能有一个会话执行此类dump。
示例
ALTER SYSTEM DUMP PRIVATE LOG;
ALTER SYSTEM DUMP LOGFILE 'redo1';
ALTER SYSTEM DUMP DATAFILE 6;
ALTER SYSTEM DUMP DATAFILE 6 BLOCK 0;
ALTER SYSTEM DUMP DATAFILE 6 MINBLOCK 128 MAXBLOCK 137;
ALTER SYSTEM DUMP SESSION 23 BACKTRACE;
# flush gts
该语句用于强制同步GTS服务的SCN到所有CN节点。单机部署中不可使用本语句。分布式部署,只有CN节点才能使用本语句。
示例(分布式部署)
ALTER SYSTEM FLUSH GTS;
# clean residual tablespace
该语句用于手动清理迁移chunk后残留的表空间,只能在分布式部署中使用。
示例(分布式部署)
ALTER SYSTEM CLEAN RESIDUAL TABLESPACE;