周五晚上,脚本在向数据库中拷贝数据时,事务没有反应了。今天早上才发现还僵在那里。
请各位指教,给个思路,多谢1. iwss=# select * from pg_stat_activity;
datid | datname | procpid | usesysid | usename | current_query | query_start
-------+---------+---------+----------+---------+---------------+-------------
17142 | iwss | 12925 | 100 | sa | |
17142 | iwss | 17611 | 100 | sa | |
17142 | iwss | 5506 | 100 | sa | |
17142 | iwss | 19322 | 100 | sa | |
17142 | iwss | 30598 | 100 | sa | |
现在没有任何sql语句在执行。2.
iwss=# select * from pg_locks;
relation | database | transaction | pid | mode | granted
----------+----------+-------------+-------+---------------------+---------
| | 41770 | 30182 | ExclusiveLock | t
| | 21599 | 12925 | ExclusiveLock | t
| | 35206 | 19322 | ExclusiveLock | t
| | 33917 | 5506 | ExclusiveLock | t
17158 | 17142 | | 19322 | AccessExclusiveLock | f
16759 | 17142 | | 30182 | AccessShareLock | t
17158 | 17142 | | 12925 | RowExclusiveLock | t
17158 | 17142 | | 5506 | AccessExclusiveLock | f
(8 rows)iwss=# select relname from pg_class where oid=17158;relname
---------
tb_rule
(1 row)
都在等tb_rule这个表,这个是正要往里拷贝数据的表。3.
[root@a]# netstat -anp | grep 5432
tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN 12555/postmaster
tcp 0 0 127.0.0.1:12984 127.0.0.1:5432 ESTABLISHED 12924/psql
tcp 0 0 127.0.0.1:45490 127.0.0.1:5432 ESTABLISHED 19321/psql
tcp 0 0 127.0.0.1:5432 127.0.0.1:45490 ESTABLISHED 19322/postgres: sa
tcp 0 0 127.0.0.1:5432 127.0.0.1:12984 ESTABLISHED 12925/postgres: sa
tcp 0 0 127.0.0.1:5432 127.0.0.1:52711 ESTABLISHED 5506/postgres: sa i
tcp 0 0 127.0.0.1:52711 127.0.0.1:5432 ESTABLISHED 5505/psql
unix 2 [ ACC ] STREAM LISTENING 7199395 12555/postmaster /tmp/.s.PGSQL.5432
unix 3 [ ] STREAM CONNECTED 7213901 17611/postgres: sa /tmp/.s.PGSQL.5432数据库创建的执行操作的进程是12925,19322和5506,对应的进程是12924,19321和55054.
12924是我们的做拷贝的进程:
[root@a]# ps -ef | grep 12925
xxx 12925 12555 0 May28 ? 00:00:00 postgres: sa iwss 127.0.0.1 COPY[root@a]# ps -ef | grep 12924
xxx 12924 12908 0 May28 ? 00:00:00 /usr/iwss/PostgreSQL/bin/psql -h localhost -p 5432 -U sa -d iwss -c \copy tb_rule from '/tmp/Configurations/tb_rule.csv' with delimiter ','而5505和12931,是定时任务,分别作reindex和vacuum,是在12924进程僵死之后,才启动的。[root@a]# ps -ef | grep 19322
xxx 19322 12555 0 05:58 ? 00:00:00 postgres: sa iwss 127.0.0.1 VACUUM waiting
[root@a]# ps -ef | grep 5506
xxx 5506 12555 0 03:28 ? 00:00:00 postgres: sa iwss 127.0.0.1 REINDEX waiting不知道怎么分析了请各位指教,多谢

解决方案 »

  1.   

    19322, 5506先杀掉吧。
    tb_rule.csv时有多少条记录?如果太多,可以分成几个文件批次提交,以诊断。
      

  2.   

    不好意思,下午一直开会。
    表结构很简单:
    iwss=# \d tb_rule;
     RuleID     | integer  | not null default nextval('public."tb_rule_RuleID_seq"'::text)
     PolicyID   | integer  | not null
     ActiveTime | smallint | not null
     RuleValue  | text     |
      

  3.   

    既然是copy data,那default nextval('public."tb_rule_RuleID_seq"'::text)似乎可以不要了。
    去掉这个试试。