首页 » ORACLE 9i-23ai, PostgreSQL/GaussDB » 如何查找其他session级alter session set修改的参数? Oracle 和Kingbase/HighgoDB(PostgreSQL)

如何查找其他session级alter session set修改的参数? Oracle 和Kingbase/HighgoDB(PostgreSQL)

ALTER SESSION命令会更改运行时配置参数,仅影响当前会话使用的值,对其他会话或系统级没有影响,有时需要知道某个会话当前的session级参数,在oracle中比较方便,目前postgresql及基于postgresql的国产库如Kingbase、Highgodb中不太容易,这里我演示gdb的方法。

# oracle

1,使用view

SQL> show parameter index

PARAMETER_NAME                                               TYPE                   VALUE
------------------------------------------------------------ ---------------------- ----------------------------------------------------------------------------------------------------
db_index_compression_inheritance                             string                 NONE
optimizer_index_caching                                      integer                0
optimizer_index_cost_adj                                     integer                100
optimizer_use_invisible_indexes                              boolean                FALSE
skip_unusable_indexes                                        boolean                TRUE

SQL> alter session set optimizer_index_cost_adj=30;
Session altered.

SQL> select * from v$ses_optimizer_env where sid=626 and name like 'optimi%' and isdefault='NO';

       SID         ID NAME                                    SQL_FEATURE            ISDEFA VALUE                CON_ID
---------- ---------- --------------------------------------- ---------------------- ------ ---------------- ----------
       626         66 optimizer_index_cost_adj                QKSFM_CBO              NO     30                        0

Note:
v$ses_optimizer_env记录的是会话级参数当前值。v$sys_optimizer_env记录的是系统级参数。

2,  使用oradebug

SQL> oradebug setorapid 99
Oracle pid: 99, Unix process pid: 1968596, image: oracle@node01 (TNS V1-V3)
SQL> oradebug dump  modified_parameters 1;
Statement processed.
SQL> @t

TRACEFILE
------------------------------------------------------------------------------------------------  
/u01/app/oracle/diag/rdbms/testdb/testdb1/trace/testdb1_ora_1968596.trc

vi  xxx.trc

Processing Oradebug command 'dump  modified_parameters 1'
DYNAMICALLY MODIFIED PARAMETERS:
  nls_language             = "AMERICAN"
  nls_territory            = "AMERICA"
  nls_sort                 = "BINARY"
  nls_date_language        = "AMERICAN"
  nls_date_format          = "YYYY-MM-DD HH24:MI:SS"
  nls_currency             = "$"
  nls_numeric_characters   = ".,"
  nls_iso_currency         = "AMERICA"
  nls_calendar             = "GREGORIAN"
  nls_time_format          = "HH.MI.SSXFF AM"
  nls_timestamp_format     = "DD-MON-RR HH.MI.SSXFF AM"
  nls_time_tz_format       = "HH.MI.SSXFF AM TZR"
  nls_timestamp_tz_format  = "DD-MON-RR HH.MI.SSXFF AM TZR"
  nls_dual_currency        = "$"
  nls_comp                 = "BINARY"
  _ipddb_enable            = TRUE
  remote_listener          = " testdb:1521"
  listener_networks        = ""
  optimizer_index_cost_adj = 30

Note:
使用oradebug dump modified_parameters 可以容易的生成修改的参数,如果该session运行的sql, 其他还有做10053 sql trace时也会生产当时SQL的环境变量。

# PostgreSQL

在PostgreSQL社区咨询的帖子 how to get value of parameter set in session for other user, 似乎是没有可能实现的, 不再发现了个有趣的,如何修改另一个进程的参数的帖子
可以alter role或alter system但是对新进程才生效,对于已存在的进程,可以使用kill -HUP xx让该进程重新加载,然后再把参数reset掉。另一个方法可以使用gdb SET VAR配置参数 print 显示变量代码值,生产不建议这么搞, 下面演示使用gdb工具的操作。

# env Kingbase V8
一个会话是ksql进入数据库, 一个会话使用gdb跟踪, 下面我使用两种颜色区分2个会话。

[kingbase@kingbase1 ~]$ sh conn.sh
ksql (V8.0)
Type "help" for help.

kingbase=# select pg_backend_pid();
 pg_backend_pid
----------------
          26844
(1 row)

[root@kingbase1 ~]# gdb /data/kingbase/bin/kingbase 26844

(gdb) set var log_statement=3

(gdb) p log_statement
$1 = 3

kingbase=# show log_statement ;
 log_statement
---------------
 all
(1 row)

(gdb) set var log_statement=1
(gdb)  p log_statement
$2 = 1

kingbase=# show log_statement;
 log_statement
---------------
 ddl
(1 row)

# 另一个参数enable_seqscan

kingbase=# show enable_seqscan;
 enable_seqscan
----------------
 on
(1 row)

(gdb) p enable_seqscan
$3 = 16843009

kingbase=# set enable_seqscan=off;
SET

-- 显示对应的值
(gdb) p enable_seqscan
$4 = 16843008

--还原
(gdb) set var enable_seqscan=16843009

kingbase=# show enable_seqscan;
 enable_seqscan
----------------
 off
(1 row)

Note:
需要知道参数值对应的代码,就可以在线修改参数和查看进程级参数(变量)。

others
HighGODB有一篇介gdb debug 在postgresql中不同阶段使用的主要函数 Trace Query Processing Internals with Debugger

— enjoy —

打赏

,

目前这篇文章还没有评论(Rss)

我要评论