瀚高数据库出现问题后可能需要查询的一些项目

652 阅读1分钟

这是我参与8月更文挑战的第16天,活动详情查看:8月更文挑战

瀚高数据库出现问题后可能需要查询的一些项目

1. 硬件信息

1.1 CPU信息

执行命令lscpu可以获得CPU的详细信息,执行结果如下

[root@registry ~]# lscpu

1.2 内存信息

使用命令“free -m”获取内存信息,获取结果如下:

[root@registry ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           3789         306        2512         124         970        3081
Swap:             0           0           0

1.3 硬盘信息

使用df命令可以获取硬盘空间及inode使用情况的信息。如下所示

#查看磁盘空间信息
[root@registry ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   36G   21G   15G  59% /
devtmpfs                 1.9G     0  1.9G   0% /dev
#查看inode使用情况
[root@registry ~]# df -i
Filesystem                Inodes  IUsed    IFree IUse% Mounted on
/dev/mapper/centos-root 18411520 211354 18200166    2% /
devtmpfs                  480814    359   480455    1% /dev

1.4 目录权限

数据库目录的权限不正确,可能会导致数据库不能正常运行,或者出现莫名的问题。使用ls命令可以获取数据库目录的权限。

通常情况执行“ls -l $PGHOME”,即可以获得瀚高数据库的家目录下文件的信息,如果没有设置环境变量,或环境变量未生效,可以知道到opt目录下找到数据库的安装目录,进入安装目录后在执行“ls -l”。如下所示

[highgo@registry ~]$ ls -l $PGHOME
total 24
drwxr-xr-x  2 highgo highgo 4096 Feb 17 13:53 bin
drwxr-xr-x  2 highgo highgo   28 Feb 17 13:53 conf
drwx------ 21 highgo highgo 4096 Apr 14 16:15 data
drwxr-xr-x  4 highgo highgo   32 Feb 17 13:53 diag
drwxr-xr-x  3 highgo highgo  135 Feb 17 15:06 etc
drwxr-xr-x  2 highgo highgo   62 Feb 17 13:53 icon
drwxr-xr-x  4 highgo highgo 4096 Feb 17 13:53 include
drwxr-xr-x  4 highgo highgo 4096 Feb 17 13:53 lib
drwxr-xr-x  5 highgo highgo   49 Feb 17 13:53 share
#直接进入安装目录查看
[highgo@registry ~]$ cd /opt/HighGo5.6.5/
[highgo@registry HighGo5.6.5]$ ls -l
total 24
drwxr-xr-x  2 highgo highgo 4096 Feb 17 13:53 bin
drwxr-xr-x  2 highgo highgo   28 Feb 17 13:53 conf
drwx------ 21 highgo highgo 4096 Apr 14 16:15 data
drwxr-xr-x  4 highgo highgo   32 Feb 17 13:53 diag
drwxr-xr-x  3 highgo highgo  135 Feb 17 15:06 etc
drwxr-xr-x  2 highgo highgo   62 Feb 17 13:53 icon
drwxr-xr-x  4 highgo highgo 4096 Feb 17 13:53 include
drwxr-xr-x  4 highgo highgo 4096 Feb 17 13:53 lib
drwxr-xr-x  5 highgo highgo   49 Feb 17 13:53 share

2. 操作系统信息

数据库出现问题时,操作系统信息有助于工程师判断问题是在数据库自身还是外部原因引起的。

2.1 操作系统版本

通过直接读取etc下的版本文件,即可以获取操作系统版本。如下所示

[root@registry ~]# cat /etc/*-release
CentOS Linux release 7.6.1810 (Core) 
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
CentOS Linux release 7.6.1810 (Core)

2.2 操作系统日志

操作系统日志有助于判断数据库出现的问题是否与操作系统或硬件有关,操作系统日志路径为“/var/log/messages”。可以使用cat命令打印日志内容,因日志内容较多,建议直接将日志文件复制出来。

[root@registry ~]# cat /var/log/messages
Apr 15 03:20:02 registry systemd: Started Session 259 of user root.
Apr 15 03:50:01 registry systemd: Started Session 262 of user root.
Apr 15 04:30:01 registry systemd: Started Session 267 of user root.

2.3 获取操作系统内核参数

在某些情况,操作系统内核参数的设置会影响数据库的正常运行,内核参数需要提供两部分信息:当前运行的参数和写入sysctl.conf中的参数。如下:

#内容较多,使用如下方式将信息存放到/tmp/sysctl.txt
[root@registry ~]# sysctl -a >/tmp/sysctl.txt
#获取当前sysctl.conf中的参数设置
[root@registry ~]# cat /etc/sysctl.conf

2.4 获取防火墙状态及规则

防火墙设置不正确可能会导致数据库连接被阻断,在数据库正常运行,但客户端无法连接到数据库时,需要查看防火墙的状态及规则。如下:

[root@registry ~]# firewall-cmd --state
running
[root@registry ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3 enp0s8
  sources: 
  services: ssh dhcpv6-client
  ports: 

3. 数据库信息

数据库的版本、参数、日志、控制文件、license等信息能为数据库问题定位提供必要的信息。单机、集群、流复制都需要提供以下信息,集群和流复制的主备机器都需要按如下方式获取相关信息。

3.1 数据库版本

在服务器上使用psql或其他客户端登录数据库,执行下面的SQL语句获取数据库的版本信息,下使用的SQL语句可以在任意可以在连接到数据库的客户端执行。如下:

[root@registry ~]# psql -U sysdba highgo

psql (4.3.4.7)
Type "help" for help.

highgo=# select kernel_version();
                      kernel_version                      
----------------------------------------------------------
 HighGo Database V4.3 Release 4.3.4.7 - 64-bit Production
(1 row)

3.2 数据库启动信息

数据库启动时间

执行以下语句获取数据库启动时间。

highgo=# select * from pg_postmaster_start_time();
   pg_postmaster_start_time    
-------------------------------
 2020-04-20 09:27:11.278359+08
(1 row)

配置文件加载时间

使用以下语句获取数据库配置文件的加载时间。

highgo=# select pg_conf_load_time();
       pg_conf_load_time       
-------------------------------
 2020-04-20 09:27:10.493388+08
(1 row)

3.3 数据库参数

数据库的参数能帮助工程师定位问题是否由数据库参数设置引起,瀚高数据库需要提供的参数包括:数据库当前使用的参数、参数文件中使用的参数。

数据库当前运行使用的参数使用命令“show all;”获取,可以使用任意能连接数据库的客户端获取,也可以使用如下方式另存到文件中。

[root@registry ~]# psql -U sysdba highgo -c "show all;" > /tmp/hgdb.conf

数据库的参数文件是数据库data目录下postgresql.conf、postgresql.auto.conf、pg_hba.conf三个文件。

3.4 数据库日志

数据库日志能为数据库工程排除问题时提供详细信息,通常情况下,数据库日志存放在data目录下,如果不确定日志的存放位置及确定需要哪个日志,可以使用如下方法确认。

#通过参数log_directory可以查看日志的存放位置,该位置是以data为原点的相对路径
[root@registry ~]# psql -U sysdba highgo
psql (4.3.4.7)
Type "help" for help.

highgo=# show log_directory ;
 log_directory 
---------------
 log
(1 row)
#查看日志的格式,%后面的参数表示保存多久,常用的后缀:w(1周)、d(1月)、j(1年),
highgo=# show log_filename ;
   log_filename    
-------------------
 hgdblog-%d.log
(1 row)
#查看当前正在使用的日志名称
highgo=# select pg_current_logfile();
  pg_current_logfile   
-----------------------
 log/postgresql-16.csv
(1 row)

确认出问题的时间,然后通过上面的查询,确认该时间段内的日志,可以只复制出问题时间段内的日志,如果无法确认时间,或多次出现相同问题,建议直接复制日志目录下的所有日志。

3.5 控制文件

控制文件数据库的重要文件之一,可以协助判断数据库问题原因。控制文件不能直接读取,需要通过pg_conftroldata命令获取,因内容较多,可以通过重定向方式将内容写入文件中。如下:

[root@registry ~]# pg_controldata >/tmp/hgdb_control.txt

3.6 license信息

license到期后,数据库会自行关闭,此时可以通过命令“check_lic”获取license信息。如下:

[root@registry ~]# check_lic

############## HIGHGODB LICENSE ###################
License status:Normal
License validity:Unlimited
Database Version:Highgo Database 4.7.6 Official Edition
###################################################

4. 集群和流复制需要收集的信息

当瀚高数据库集群或流复制出现问题时,除像单机版一样收集以上信息(主备节点都要收集),还需要额外收集:流复制状态信息、recovery.conf文件、repmgr配置文件等信息。

4.1 集群和流复制都需要查询的信息

查询节点间状态信息

#查询节点间状态信息
highgo=# select * from pg_stat_replication;
  pid  | usesysid | usename | application_name |  client_addr  | client_hostname | client_port |         backend_start         | backend_xmin |   state   |  sent_lsn  | write_lsn  | flush_lsn  | replay_lsn | write_lag | flush_lag | re
play_lag | sync_priority | sync_state 
-------+----------+---------+------------------+---------------+-----------------+-------------+-------------------------------+--------------+-----------+------------+------------+------------+------------+-----------+-----------+---
---------+---------------+------------
 24544 |      443 | sysdba  | walreceiver      | 192.168.80.44 |                 |       45060 | 2020-04-20 09:27:12.934557+08 |              | streaming | 0/4E000140 | 0/4E000140 | 0/4E000140 | 0/4E000140 |           |           |   
         |             0 | async
(1 row)

#查询主备节点延迟情况
highgo=# SELECT pg_wal_lsn_diff (pg_current_wal_insert_lsn(), replay_lsn ) AS lag_bytes, application_name FROM pg_stat_replication;
 lag_bytes | application_name 
-----------+------------------
         0 | walreceiver
(1 row)

集群和流复制的备节点的数据目录data下有recovery.conf文件,需要拷贝下来,一同发送给瀚高工程师。

4.2 集群需要额外提供的信息

集群数据库主备节点的安装目录下的conf目录下有文件hg_repmgr.conf,需要拷贝下来,一同发送给瀚高工程师。

如下文件:

[root@registry conf]# pwd
/opt/HighGo4.3.4.7-see/conf
[root@registry conf]# ls -l hg_repmgr.conf 
-rw-r--r-- 1 root root 15233 Apr 13 15:24 hg_repmgr.conf

5. 性能相关

本部分介绍了在瀚高数据库出现性能问题时,需要获取的信息,以下部分,涉及操作系统命令,均为最常用的命令。

5.1 CPU负载情况

top命令可以获取当前系统中各个系统的资源使用情况,可以使用如下命令获取top的执行结果,以下命令需要在数据库出现性能问题期间执行,执行时长为5分钟,执行过程中不要关闭,不要执行其他操作,执行完成后,会在当前目录产生top.txt这个文件,请将该文件拷贝下来,发送给瀚高工程师。

[root@registry conf]# top -d 3 -n 100 -b -i -c -H > top.txt

5.2 内存使用情况

使用free命令可以获取操作系统的内存使用情况,使用如下命令获取内存使用情况,并保存到文件中,发送给瀚高工程师。

[root@registry conf]# free -m
              total        used        free      shared  buff/cache   available
Mem:           3789         327        1439         185        2022        2987
Swap:             0           0           0

5.3 磁盘读写情况

iostat可以获取磁盘的读写情况,使用如下命令获取磁盘的读写情况,以下命令会获取一分钟中内磁盘的读写情况,请在问题期间执行,结果保存在diskio.txt文件中,请将该文件发送给瀚高工程师。

[root@registry conf]# iostat -d -x -k 1 60 >diskio.txt

5.4 获取单条SQL的执行计划

在系统运行过程中,如发现某条SQL语句的执行速度比较慢,可以使用explain命令获取SQL语句的执行计划,该命令获取到的执行计划不是真实执行后的执行计划,适用于SQL语句执行时间较长,需要快速获取执行计划的情况。如需要获取真实的执行计划,需要使用explain命令的analyze选项。两种获取执行计划的示例如下:

#获取规划器中的执行计划
highgo=# explain select * from hgtest limit 1;
                              QUERY PLAN                               
-----------------------------------------------------------------------
 Limit  (cost=0.00..0.02 rows=1 width=8)
   ->  Seq Scan on hgtest  (cost=0.00..154053.60 rows=9999860 width=8)
(2 rows)

#获取真实的执行计划
highgo=# explain analyze select * from hgtest limit 1;
                                                   QUERY PLAN                                                    
-----------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.00..0.02 rows=1 width=8) (actual time=0.022..0.024 rows=1 loops=1)
   ->  Seq Scan on hgtest  (cost=0.00..154053.60 rows=9999860 width=8) (actual time=0.021..0.021 rows=1 loops=1)
 Planning time: 0.080 ms
 Execution time: 0.068 ms
(4 rows)

5.5 批量获取执行速度慢的SQL

通过设置数据库的参数,可以批量获取执行时间超过一定时间的SQL语句。设置方式如下:

#修改配置文件postgresql.conf,设置以下参数
#开启日志记录
logging_collector = on
#设置日志输出格式,格式有stderr(默认), csvlog , syslog
log_destination = 'csvlog’
#设置日志存放位置,下面设置表示日志存放在$PGDATA下hgdb_log日志中
log_directory = 'hgdb_log’
#设置日志截断
log_truncate_on_rotation = on
#设置日志的名称
log_filename = 'highgodb_%d.log’
#设置跟踪的SQL语句级别,级别包含none(默认,只记录出错信息), ddl, mod, all
log_statement = all
#记录执行超过以下时间的SQL语句,单位毫秒,根据需要调整时间
log_min_duration_statement = 5000

设置上述参数后,需要重启数据库生效,日志存放在data目录下的hgdb_log目录中。