数据库参数查询怎么做
数据库参数查询,数据数查说白了就是库参看数据库当前跑得怎么样,配置合不合理。数据数查这事儿听着简单,库参做起来有不少门道。数据数查我见过太多人一上来就`SHOW VARIABLES`,库参刷出一屏参数,数据数查然后盯着`max_connections`发呆——这纯属浪费时间。库参 先分清两类参数:一类是数据数查`global`级别的,影响整个实例;一类是库参`session`级别的,只影响当前连接。数据数查MySQL里查全局参数用`SHOW GLOBAL VARIABLES`,库参查当前会话用`SHOW SESSION VARIABLES`,数据数查不写默认是库参session。搞混了会得出错误结论。数据数查比如你改了全局的`sort_buffer_size`,新连接生效,但老连接还是旧值——这时候查session参数,看到的是旧值,容易误判。 实际干活的时候,我习惯先查状态值,再查参数值。状态值反映“实际发生了什么”,参数值反映“你打算让它怎么跑”。比如查`SHOW GLOBAL STATUS LIKE 'Threads_connected'`,看到当前连接数200,再查`SHOW GLOBAL VARIABLES LIKE 'max_connections'`,看到上限500——这才能判断连接数是否紧张。光看参数不看状态,等于只看菜单不看客人吃了多少。 MySQL 5.7以后有个更方便的`performance_schema`,里面`global_variables`和`session_variables`两张表,可以直接用SQL查。比如: ```sql SELECT * FROM performance_schema.global_variables WHERE VARIABLE_NAME LIKE 'innodb%'; ``` 这比`SHOW`灵活,能排序、能过滤、能关联其他表。但有个坑——performance_schema默认可能没开启,得先确认`SHOW VARIABLES LIKE 'performance_schema'`是ON。 PostgreSQL的玩法不一样。它的参数存在`pg_settings`视图里,字段更丰富。我最常用的是: ```sql SELECT name, setting, unit, context, pending_restart FROM pg_settings WHERE name IN ('work_mem', 'shared_buffers', 'max_connections'); ``` 注意那个`context`字段——它告诉你这个参数改完要不要重启。`postmaster`类型的参数(比如`shared_buffers`)必须重启,`user`类型的(比如`work_mem`)当前会话就能改。`pending_restart`字段直接告诉你:这个参数改了但还没重启生效。这比MySQL直观多了。 还有个技巧,查参数时顺便看下`source`字段。PostgreSQL 9.6以后能知道参数值是从哪来的——配置文件、命令行、环境变量还是默认值。排查问题的时候特有用。比如你改了`postgresql.conf`里的`work_mem`,但实际跑的还是默认值,一查`source`发现是`default`,说明配置文件没生效或者改错地方了。 Oracle就麻烦点。没有统一的视图,得用`SHOW PARAMETER`命令,或者查`V$PARAMETER`和`V$SPPARAMETER`。前者显示当前会话生效的值,后者显示SPFILE里的值。两者不一致,说明有人用`ALTER SYSTEM`改过但没重启,或者改了会话级。Oracle里改参数还得分`SCOPE=MEMORY`(只改内存,重启失效)、`SCOPE=SPFILE`(只改文件,重启生效)、`SCOPE=BOTH`(都改)。查的时候得留意你查的是哪一层。 说个具体案例。上周帮人调一个MySQL慢查询,`SHOW PROCESSLIST`看到一堆`Copying to tmp table`,于是查`tmp_table_size`和`max_heap_table_size`,都是默认的16M和16M。但实际查出来临时表动不动就几十M——为什么?因为这两个参数是session级的,而且取的是两者最小值。那哥们儿只改了全局的`tmp_table_size`,没改`max_heap_table_size`,新会话里取最小值还是16M。这就是参数查询没查全导致的坑。 最后说个实用小工具。MySQL 8.0的`sys`库里有`sys.ps_config`之类的视图,能直接看参数和状态的对比,不用自己拼SQL。PostgreSQL的话,`\d pg_settings`能看到所有字段说明,`\pset`调整输出格式,别让一长串参数挤成乱码。 参数查询不是目的,是为了定位问题。下次查的时候,先想清楚:我要回答什么问题?是“连接数够不够”还是“排序缓冲区太小”?带着问题去查,比漫无目的刷一堆参数有用得多。
-
上一篇
-
下一篇