#ALTER SYSTEM

# 通用描述

ALTER SYSTEM用于动态地改变所在数据库实例(Instance)的属性,立即生效(但对于ALTER SYSTEM SET PARAMETER可设定为重启生效)且对所有用户生效。

# 语句定义

alter system::=

syntax
ALTER SYSTEM set_parameter_clause SWITCH LOGFILE CHECKPOINT FLUSH BUFFER_CACHE EXTEND BUFFER_CACHE SIZE size_clause SWITCH LOGFILE ARCHIVE LOG CURRENT kill_session_clause cancel_sql_clause IGNORE STANDBY MISMATCHED REDO dump_clause

set_parameter_clause::=

syntax
SET parameter_name = parameter_value SCOPE = spfile memory both TYPE = CN DN MN ALL NODE = node_id

kill_session_clause::=

syntax
KILL SESSION ' session_id , session_serial '

cancel_sql_clause::=

syntax
CANCEL SQL ' session_id , session_serial , sql_id '

dump_clause::=

syntax::= DUMP (PRIVATE LOG
|LOGFILE file_name
|DATAFILE file_id (|BLOCK block_id|MINBLOCK block_id MAXBLOCK block_id)
|SESSION sid BACKTRACE)

# set_parameter_clause

该语句用于修改数据库的配置参数

如果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;

# 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

超过限定值将会提示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 * FROM area WHERE area_no='01' FOR UPDATE;
  
--查看锁及会话信息
SELECT * FROM V$LOCK;
    SID             ID1        ID2 LMODE     REQUEST   
-------- --------------- ---------- --------- ---------
      21            1328            TS                 
      21     21474844928          0 ROW                
  
SELECT sid,serial# FROM V$SESSION WHERE sid IN (21);
     SID      SERIAL#
-------- ------------
      21            2
          
  
--下面操作需要拥有管理员权限
--通过SID和SERIAL#参数终止指定会话
ALTER SYSTEM KILL SESSION '21,2';

分布式跨CN会话杀除

在配置了多CN的分布式环境中,可使用本语句进行跨CN的会话终止,此时的SID应为分布式部署中的全局会话ID(可从DV$SESSION视图的global_session_id字段获得)。

示例(在一个配置了2-1和2-2两个CN节点的分布式环境中)

--连接2-1,建立一个会话,查看此会话的全局会话ID
SELECT USERENV('SID') FROM dual;
USERENV('SID') 
-------------- 
        131091

--获取SERIAL#
SELECT global_session_id, serial FROM DV$SESSION WHERE global_session_id IN (131091);
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操作,此时的SID应为分布式部署中的全局会话ID。

示例

--在sales用户下执行如下语句(会话1)
SELECT * FROM area WHERE area_no='01' FOR UPDATE;

--开启新会话2,以sales用户登录,添加等锁SQL,使其处于执行状态中
UPDATE area SET DHQ='Shanghai3' WHERE area_no='01';

--开启新会话3,以系统用户登录
SELECT * 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加密表空间的数据文件某些页面或整个数据文件时,这些页面会受到保护,不会解析。

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 20 BACKTRACE;