如何查找其他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 —
上一篇:
下一篇: 存储磁盘测试工具fio和dd常用场景
目前这篇文章还没有评论(Rss)