• psqlrc

    1. -- check active session
    2. \set active_session 'select pid,usename,datname,application_name,client_addr,age(clock_timestamp(), query_start),query from pg_stat_activity where pid<>pg_backend_pid() and state=\'active\' order by query_start desc;'
    3.  
    4. -- all_reslove_session
    5. \set session 'select pid,usename,datname,application_name,client_addr,age(clock_timestamp(), query_start),query from pg_stat_activity where pid<>pg_backend_pid() and state=\'idle\' and upper(query) not like \'SET%\' and upper(query) not like \'SHOW%\' and query != \'COMMIT\' order by query_start desc;'
    6. -- check wait events
    7. \set wait_event 'select pid,application_name,client_addr,age(clock_timestamp(),query_start),state,wait_event_type,wait_event from pg_stat_activity where pid<>pg_backend_pid() and wait_event is not null order by wait_event_type;'
    8.  
    9. -- table_size
    10. \set table_size 'select table_name,pg_size_pretty(total_bytes) AS total, pg_size_pretty(index_bytes) AS idx , pg_size_pretty(toast_bytes) AS toast , pg_size_pretty(table_bytes) AS relsize from (select *, total_bytes-index_bytes-COALESCE(toast_bytes,0) AS table_bytes FROM ( SELECT c.oid,nspname AS table_schema, relname AS table_name , c.reltuples AS row_estimate , pg_total_relation_size(c.oid) AS total_bytes , pg_indexes_size(c.oid) AS index_bytes , pg_total_relation_size(reltoastrelid) AS toast_bytes FROM pg_class c LEFT JOIN pg_namespace n ON n.oid = c.relnamespace WHERE relkind = \'r\' and relname in (select tablename from pg_tables where schemaname=\'public\') ) a) a order by total_bytes desc;'
    11.  
    12. --database size
    13. \set database_size 'SELECT d.datname AS Name,pg_catalog.pg_get_userbyid(d.datdba) AS Owner,CASE WHEN pg_catalog.has_database_privilege(d.datname, \'CONNECT\') THEN pg_catalog.pg_size_pretty(pg_catalog.pg_database_size(d.datname)) ELSE \'No Access\' END AS SIZE FROM pg_catalog.pg_database d ORDER BY CASE WHEN pg_catalog.has_database_privilege(d.datname, \'CONNECT\') THEN pg_catalog.pg_database_size(d.datname) ELSE NULL END DESC LIMIT 20;'
    14.  
    15. --redshift running sqls
    16. \set redshift_run 'SELECT pid,starttime,duration,trim(user_name) AS user,trim(query) AS querytxt FROM stv_recents WHERE STATUS = \'Running\' order by starttime desc;'
  • Update records
    1. update cloud_subscribers a set subscriber_location_id=b.subscriber_location_id from mtco_subscribers b where a.org_id='' and a.subscriber_id=b.subscriber_id;

    get dead lines more than 100 :

    1. SELECT schemaname||'.'||relname as table_name,pg_size_pretty(pg_relation_size(schemaname||'.'||relname)) as table_size,n_dead_tup,n_live_tup,round(n_dead_tup * 100 / (n_live_tup + n_dead_tup),2) AS dead_tup_ratio FROM
    2. pg_stat_all_tables where n_dead_tup >= 100 ORDER BY pg_relation_size(schemaname||'.'||relname) DESC LIMIT 10;
  • 更新含有外键的记录
    1. postgres=# with new_a as (update calixspid set orgid=5950 where orgid=291040) update calixorganization set id=5950 where id=291040;
    2. UPDATE 1

    postgres=# \d calixspid
    Table "public.calixspid"
    Column | Type | Modifiers
    --------+------------------------+------------------------------------------------
    id | bigint | not null default nextval('spid_seq'::regclass)
    orgid | bigint | not null
    spid | character varying(255) |
    Indexes:
    "calixspid_pkey" PRIMARY KEY, btree (id)
    Foreign-key constraints:
    "calixspid_orgid_fkey" FOREIGN KEY (orgid) REFERENCES calixorganization(id)

  • Connections
    1. select count(*) from pg_stat_activity;
    2. select client_addr,state,count(*) from pg_stat_activity group by client_addr,state order by count(*) desc;
    3. select max_conn,used,res_for_super,max_conn-used-res_for_super res_for_normal
    4. from (select count(*) used from pg_stat_activity) t1,
    5. (select setting::int res_for_super from pg_settings where name=$$superuser_reserved_connections$$) t2,
    6. (select setting::int max_conn from pg_settings where name=$$max_connections$$) t3;

      

  • Show Running Sql
    1. -- show running queries (pre 9.2)
    2. SELECT procpid, age(clock_timestamp(), query_start), usename, current_query
    3. FROM pg_stat_activity
    4. WHERE current_query != '<IDLE>' AND current_query NOT ILIKE '%pg_stat_activity%'
    5. ORDER BY query_start desc;
    6. -- show running queries (9.2)
    7. SELECT pid, age(clock_timestamp(), query_start), usename, query
    8. FROM pg_stat_activity
    9. WHERE query != '<IDLE>' AND query NOT ILIKE '%pg_stat_activity%'
    10. ORDER BY query_start desc;
    11.  
    12. -- show running sqls more than 2 mins (9.2+)
    13. SELECT now() - query_start as "runtime", usename, datname, state, query
    14. FROM pg_stat_activity
    15. WHERE now() - query_start > '2 minutes'::interval
    16. ORDER BY runtime DESC;
    17.  
    18. --show all queries
    19. select substr(query,1,100) query,backend_type,application_name,query_start,wait_event_type,wait_event,state from pg_stat_activity;
  • Vacuum
    1. --get vacuum status and results
    2. select relname,last_vacuum, last_autovacuum, last_analyze, last_autoanalyze from pg_stat_user_tables;
    3.  
    4. --query by sigle table of vacuum status
    5. select relname, n_dead_tup, last_vacuum, last_autovacuum from pg_catalog.pg_stat_all_tables where n_dead_tup > 0 and relname ='sxacc-devices' order by n_dead_tup desc;
    6.  
    7. -- vacuum command
    8. VACUUM (VERBOSE, ANALYZE);
  • Database and Tables releated
    1. -- table index usage rates (should not be less than 0.99)
    2. SELECT relname,
    3. CASE WHEN (seq_scan + idx_scan) != 0
    4. THEN 100.0 * idx_scan / (seq_scan + idx_scan)
    5. ELSE 0
    6. END AS percent_of_times_index_used,
    7. n_live_tup AS rows_in_table
    8. FROM pg_stat_user_tables
    9. ORDER BY n_live_tup DESC;
    10.  
    11. -- all database users
    12. select * from pg_stat_activity where current_query not like '<%';
    13.  
    14. -- all databases and their sizes
    15. select * from pg_user;
    16.  
    17. -- all tables and their size, with/without indexes
    18. select datname, pg_size_pretty(pg_database_size(datname)) from pg_database order by pg_database_size(datname) desc;
    19.  
    20. -- cache hit rates (should not be less than 0.99)
    21. SELECT sum(heap_blks_read) as heap_read, sum(heap_blks_hit) as heap_hit, (sum(heap_blks_hit) - sum(heap_blks_read)) / sum(heap_blks_hit) as ratio FROM pg_statio_user_tables;
    22.  
    23. -- table index usage rates (should not be less than 0.99)
    24. SELECT relname, 100 * idx_scan / (seq_scan + idx_scan) percent_of_times_index_used, n_live_tup rows_in_table FROM pg_stat_user_tables ORDER BY n_live_tup DESC;
    25.  
    26. -- how many indexes are in cache
    27. SELECT sum(idx_blks_read) as idx_read, sum(idx_blks_hit) as idx_hit, (sum(idx_blks_hit) - sum(idx_blks_read)) / sum(idx_blks_hit) as ratio FROM pg_statio_user_indexes;
    28.  
    29. -- check the size(as in disk space) of all databases;
      SELECT d.datname AS Name, pg_catalog.pg_get_userbyid(d.datdba) AS Owner,
      CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')
      THEN pg_catalog.pg_size_pretty(pg_catalog.pg_database_size(d.datname))
      ELSE 'No Access'
      END AS SIZE
      FROM pg_catalog.pg_database d
      ORDER BY
      CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')
      THEN pg_catalog.pg_database_size(d.datname)
      ELSE NULL
      END;
      --check the size(as in space) of each table
      SELECT nspname || '.' || relname AS "relation",
      pg_size_pretty(pg_total_relation_size(C.oid)) AS "total_size"
      FROM pg_class C
      LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
      WHERE nspname NOT IN ('pg_catalog', 'information_schema')
      AND C.relkind <> 'i'
      AND nspname !~ '^pg_toast'
      ORDER BY pg_total_relation_size(C.oid) DESC;
      -- all tables and their size, with/without indexes
      select datname, pg_size_pretty(pg_database_size(datname))
      from pg_database
      order by pg_database_size(datname) desc;
      -- show unused indexes:
      SELECT relname AS table_name, indexrelname AS index_name, idx_scan, idx_tup_read, idx_tup_fetch, pg_size_pretty(pg_relation_size(indexrelname::regclass))
      FROM pg_stat_all_indexes
      WHERE schemaname = 'public'
      AND idx_scan = 0
      AND idx_tup_read = 0
      AND idx_tup_fetch = 0
      ORDER BY pg_relation_size(indexrelname::regclass) DESC;

     

  • locks
    1. -- all locks
    2. SELECT t.relname, l.locktype, page, virtualtransaction, pid, mode, granted
    3. FROM pg_locks l, pg_stat_all_tables t
    4. WHERE l.relation = t.relid ORDER BY relation asc;
    5.  
    6. -- Сombination of blocked and blocking activity
    7. -- The following query may be helpful to see what processes are blocking SQL statements (these only find row-level locks, not object-level locks).
    8. SELECT blocked_locks.pid AS blocked_pid,
    9. blocked_activity.usename AS blocked_user,
    10. blocking_locks.pid AS blocking_pid,
    11. blocking_activity.usename AS blocking_user,
    12. blocked_activity.query AS blocked_statement,
    13. blocking_activity.query AS current_statement_in_blocking_process
    14. FROM pg_catalog.pg_locks blocked_locks
    15. JOIN pg_catalog.pg_stat_activity blocked_activity ON blocked_activity.pid = blocked_locks.pid
    16. JOIN pg_catalog.pg_locks blocking_locks
    17. ON blocking_locks.locktype = blocked_locks.locktype
    18. AND blocking_locks.DATABASE IS NOT DISTINCT FROM blocked_locks.DATABASE
    19. AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation
    20. AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page
    21. AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple
    22. AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid
    23. AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid
    24. AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid
    25. AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid
    26. AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid
    27. AND blocking_locks.pid != blocked_locks.pid
    28.  
    29. JOIN pg_catalog.pg_stat_activity blocking_activity ON blocking_activity.pid = blocking_locks.pid
    30. WHERE NOT blocked_locks.GRANTED;
    31.  
    32. -- Here's an alternate view of that same data that includes application_name's
    33.  
    34. -- Setting application_name variable in the begging of each transaction allows you to which logical process blocks another one. It can be information which source code line starts transaction or any other information that helps you to match application_name to your code.
    35. SET application_name='%your_logical_name%';
    36.  
    37. SELECT blocked_locks.pid AS blocked_pid,
    38. blocked_activity.usename AS blocked_user,
    39. blocking_locks.pid AS blocking_pid,
    40. blocking_activity.usename AS blocking_user,
    41. blocked_activity.query AS blocked_statement,
    42. blocking_activity.query AS current_statement_in_blocking_process,
    43. blocked_activity.application_name AS blocked_application,
    44. blocking_activity.application_name AS blocking_application
    45. FROM pg_catalog.pg_locks blocked_locks
    46. JOIN pg_catalog.pg_stat_activity blocked_activity ON blocked_activity.pid = blocked_locks.pid
    47. JOIN pg_catalog.pg_locks blocking_locks
    48. ON blocking_locks.locktype = blocked_locks.locktype
    49. AND blocking_locks.DATABASE IS NOT DISTINCT FROM blocked_locks.DATABASE
    50. AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation
    51. AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page
    52. AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple
    53. AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid
    54. AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid
    55. AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid
    56. AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid
    57. AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid
    58. AND blocking_locks.pid != blocked_locks.pid
    59.  
    60. JOIN pg_catalog.pg_stat_activity blocking_activity ON blocking_activity.pid = blocking_locks.pid
    61. WHERE NOT blocked_locks.GRANTED;
    62.  
    63. -- Here's an alternate view of that same data that includes an idea how old the state is
    64. SELECT a.datname,
    65. l.relation::regclass,
    66. l.transactionid,
    67. l.mode,
    68. l.GRANTED,
    69. a.usename,
    70. a.query,
    71. a.query_start,
    72. age(now(), a.query_start) AS "age",
    73. a.pid
    74. FROM pg_stat_activity a
    75. JOIN pg_locks l ON l.pid = a.pid
    76. ORDER BY a.query_start;
    77.  
    78. -- Flat view of Blocking
    79. -- For PostgreSQL Version < 9.2
    80. SELECT
    81. waiting.locktype AS waiting_locktype,
    82. waiting.relation::regclass AS waiting_table,
    83. waiting_stm.current_query AS waiting_query,
    84. waiting.mode AS waiting_mode,
    85. waiting.pid AS waiting_pid,
    86. other.locktype AS other_locktype,
    87. other.relation::regclass AS other_table,
    88. other_stm.current_query AS other_query,
    89. other.mode AS other_mode,
    90. other.pid AS other_pid,
    91. other.GRANTED AS other_granted
    92. FROM
    93. pg_catalog.pg_locks AS waiting
    94. JOIN
    95. pg_catalog.pg_stat_activity AS waiting_stm
    96. ON (
    97. waiting_stm.procpid = waiting.pid
    98. )
    99. JOIN
    100. pg_catalog.pg_locks AS other
    101. ON (
    102. (
    103. waiting."database" = other."database"
    104. AND waiting.relation = other.relation
    105. )
    106. OR waiting.transactionid = other.transactionid
    107. )
    108. JOIN
    109. pg_catalog.pg_stat_activity AS other_stm
    110. ON (
    111. other_stm.procpid = other.pid
    112. )
    113. WHERE
    114. NOT waiting.GRANTED
    115. AND
    116. waiting.pid <> other.pid
    117.  
    118. -- For PostgreSQL Version >= 9.2
    119. SELECT
    120. waiting.locktype AS waiting_locktype,
    121. waiting.relation::regclass AS waiting_table,
    122. waiting_stm.query AS waiting_query,
    123. waiting.mode AS waiting_mode,
    124. waiting.pid AS waiting_pid,
    125. other.locktype AS other_locktype,
    126. other.relation::regclass AS other_table,
    127. other_stm.query AS other_query,
    128. other.mode AS other_mode,
    129. other.pid AS other_pid,
    130. other.GRANTED AS other_granted
    131. FROM
    132. pg_catalog.pg_locks AS waiting
    133. JOIN
    134. pg_catalog.pg_stat_activity AS waiting_stm
    135. ON (
    136. waiting_stm.pid = waiting.pid
    137. )
    138. JOIN
    139. pg_catalog.pg_locks AS other
    140. ON (
    141. (
    142. waiting."database" = other."database"
    143. AND waiting.relation = other.relation
    144. )
    145. OR waiting.transactionid = other.transactionid
    146. )
    147. JOIN
    148. pg_catalog.pg_stat_activity AS other_stm
    149. ON (
    150. other_stm.pid = other.pid
    151. )
    152. WHERE
    153. NOT waiting.GRANTED
    154. AND
    155. waiting.pid <> other.pid
    156.  
    157. -- Recursive View of Blocking
    158. WITH RECURSIVE
    159. c(requested, CURRENT) AS
    160. ( VALUES
    161. ('AccessShareLock'::text, 'AccessExclusiveLock'::text),
    162. ('RowShareLock'::text, 'ExclusiveLock'::text),
    163. ('RowShareLock'::text, 'AccessExclusiveLock'::text),
    164. ('RowExclusiveLock'::text, 'ShareLock'::text),
    165. ('RowExclusiveLock'::text, 'ShareRowExclusiveLock'::text),
    166. ('RowExclusiveLock'::text, 'ExclusiveLock'::text),
    167. ('RowExclusiveLock'::text, 'AccessExclusiveLock'::text),
    168. ('ShareUpdateExclusiveLock'::text, 'ShareUpdateExclusiveLock'::text),
    169. ('ShareUpdateExclusiveLock'::text, 'ShareLock'::text),
    170. ('ShareUpdateExclusiveLock'::text, 'ShareRowExclusiveLock'::text),
    171. ('ShareUpdateExclusiveLock'::text, 'ExclusiveLock'::text),
    172. ('ShareUpdateExclusiveLock'::text, 'AccessExclusiveLock'::text),
    173. ('ShareLock'::text, 'RowExclusiveLock'::text),
    174. ('ShareLock'::text, 'ShareUpdateExclusiveLock'::text),
    175. ('ShareLock'::text, 'ShareRowExclusiveLock'::text),
    176. ('ShareLock'::text, 'ExclusiveLock'::text),
    177. ('ShareLock'::text, 'AccessExclusiveLock'::text),
    178. ('ShareRowExclusiveLock'::text, 'RowExclusiveLock'::text),
    179. ('ShareRowExclusiveLock'::text, 'ShareUpdateExclusiveLock'::text),
    180. ('ShareRowExclusiveLock'::text, 'ShareLock'::text),
    181. ('ShareRowExclusiveLock'::text, 'ShareRowExclusiveLock'::text),
    182. ('ShareRowExclusiveLock'::text, 'ExclusiveLock'::text),
    183. ('ShareRowExclusiveLock'::text, 'AccessExclusiveLock'::text),
    184. ('ExclusiveLock'::text, 'RowShareLock'::text),
    185. ('ExclusiveLock'::text, 'RowExclusiveLock'::text),
    186. ('ExclusiveLock'::text, 'ShareUpdateExclusiveLock'::text),
    187. ('ExclusiveLock'::text, 'ShareLock'::text),
    188. ('ExclusiveLock'::text, 'ShareRowExclusiveLock'::text),
    189. ('ExclusiveLock'::text, 'ExclusiveLock'::text),
    190. ('ExclusiveLock'::text, 'AccessExclusiveLock'::text),
    191. ('AccessExclusiveLock'::text, 'AccessShareLock'::text),
    192. ('AccessExclusiveLock'::text, 'RowShareLock'::text),
    193. ('AccessExclusiveLock'::text, 'RowExclusiveLock'::text),
    194. ('AccessExclusiveLock'::text, 'ShareUpdateExclusiveLock'::text),
    195. ('AccessExclusiveLock'::text, 'ShareLock'::text),
    196. ('AccessExclusiveLock'::text, 'ShareRowExclusiveLock'::text),
    197. ('AccessExclusiveLock'::text, 'ExclusiveLock'::text),
    198. ('AccessExclusiveLock'::text, 'AccessExclusiveLock'::text)
    199. ),
    200. l AS
    201. (
    202. SELECT
    203. (locktype,DATABASE,relation::regclass::text,page,tuple,virtualxid,transactionid,classid,objid,objsubid) AS target,
    204. virtualtransaction,
    205. pid,
    206. mode,
    207. GRANTED
    208. FROM pg_catalog.pg_locks
    209. ),
    210. t AS
    211. (
    212. SELECT
    213. blocker.target AS blocker_target,
    214. blocker.pid AS blocker_pid,
    215. blocker.mode AS blocker_mode,
    216. blocked.target AS target,
    217. blocked.pid AS pid,
    218. blocked.mode AS mode
    219. FROM l blocker
    220. JOIN l blocked
    221. ON ( NOT blocked.GRANTED
    222. AND blocker.GRANTED
    223. AND blocked.pid != blocker.pid
    224. AND blocked.target IS NOT DISTINCT FROM blocker.target)
    225. JOIN c ON (c.requested = blocked.mode AND c.CURRENT = blocker.mode)
    226. ),
    227. r AS
    228. (
    229. SELECT
    230. blocker_target,
    231. blocker_pid,
    232. blocker_mode,
    233. '1'::INT AS depth,
    234. target,
    235. pid,
    236. mode,
    237. blocker_pid::text || ',' || pid::text AS seq
    238. FROM t
    239. UNION ALL
    240. SELECT
    241. blocker.blocker_target,
    242. blocker.blocker_pid,
    243. blocker.blocker_mode,
    244. blocker.depth + 1,
    245. blocked.target,
    246. blocked.pid,
    247. blocked.mode,
    248. blocker.seq || ',' || blocked.pid::text
    249. FROM r blocker
    250. JOIN t blocked
    251. ON (blocked.blocker_pid = blocker.pid)
    252. WHERE blocker.depth < 1000
    253. )
    254. SELECT * FROM r
    255. ORDER BY seq;
    256.  
    257. -- the following view also adds useful information about the sessions in the blocking tree.
    258. CREATE OR REPLACE VIEW blocking_tree AS
    259. WITH RECURSIVE
    260. LOCK AS (
    261. SELECT pid,
    262. virtualtransaction,
    263. GRANTED,
    264. mode,
    265. (locktype,
    266. CASE locktype
    267. WHEN 'relation' THEN concat_ws(';', 'db:'||datname, 'rel:'||relation::regclass::text)
    268. WHEN 'extend' THEN concat_ws(';', 'db:'||datname, 'rel:'||relation::regclass::text)
    269. WHEN 'page' THEN concat_ws(';', 'db:'||datname, 'rel:'||relation::regclass::text, 'page#'||page::text)
    270. WHEN 'tuple' THEN concat_ws(';', 'db:'||datname, 'rel:'||relation::regclass::text, 'page#'||page::text, 'tuple#'||tuple::text)
    271. WHEN 'transactionid' THEN transactionid::text
    272. WHEN 'virtualxid' THEN virtualxid::text
    273. WHEN 'object' THEN concat_ws(';', 'class:'||classid::regclass::text, 'objid:'||objid, 'col#'||objsubid)
    274. ELSE concat('db:'||datname) -- userlock and advisory
    275. END::text) AS target
    276. FROM pg_catalog.pg_locks
    277. LEFT JOIN pg_catalog.pg_database ON (pg_database.oid = pg_locks.DATABASE)
    278. )
    279. , waiting_lock AS (
    280. SELECT
    281. blocker.pid AS blocker_pid,
    282. blocked.pid AS pid,
    283. concat(blocked.mode,blocked.target) AS lock_target
    284. FROM LOCK blocker
    285. JOIN LOCK blocked
    286. ON ( NOT blocked.GRANTED
    287. AND blocker.GRANTED
    288. AND blocked.pid != blocker.pid
    289. AND blocked.target IS NOT DISTINCT FROM blocker.target)
    290. JOIN lock_composite c ON (c.requested = blocked.mode AND c.CURRENT = blocker.mode)
    291. )
    292. , acquired_lock AS (
    293. WITH waiting AS (
    294. SELECT lock_target, COUNT(lock_target) AS wait_count FROM waiting_lock GROUP BY lock_target
    295. )
    296. SELECT
    297. pid,
    298. array_agg(concat(mode,target,' + '||wait_count) ORDER BY wait_count DESC NULLS LAST) AS locks_acquired
    299. FROM LOCK
    300. LEFT JOIN waiting ON waiting.lock_target = concat(mode,target)
    301. WHERE GRANTED
    302. GROUP BY pid
    303. )
    304. , blocking_lock AS (
    305. SELECT
    306. ARRAY[date_part('epoch', query_start)::INT, pid] AS seq,
    307. 0::INT AS depth,
    308. -1::INT AS blocker_pid,
    309. pid,
    310. concat('Connect: ',usename,' ',datname,' ',COALESCE(host(client_addr)||':'||client_port, 'local')
    311. , E'\nSQL: ',REPLACE(substr(COALESCE(query,'N/A'), 1, 60), E'\n', ' ')
    312. , E'\nAcquired:\n '
    313. , array_to_string(locks_acquired[1:5] ||
    314. CASE WHEN array_upper(locks_acquired,1) > 5
    315. THEN '... '||(array_upper(locks_acquired,1) - 5)::text||' more ...'
    316. END,
    317. E'\n ')
    318. ) AS lock_info,
    319. concat(to_char(query_start, CASE WHEN age(query_start) > '24h' THEN 'Day DD Mon' ELSE 'HH24:MI:SS' END),E' started\n'
    320. ,CASE WHEN waiting THEN 'waiting' ELSE state END,E'\n'
    321. ,date_trunc('second',age(now(),query_start)),' ago'
    322. ) AS lock_state
    323. FROM acquired_lock blocker
    324. LEFT JOIN pg_stat_activity act USING (pid)
    325. WHERE EXISTS -- The root of the tree should blocks one or more sessions.
    326. (SELECT 'x' FROM waiting_lock blocked WHERE blocked.blocker_pid = blocker.pid)
    327. AND NOT EXISTS -- The root of the tree should not be a blocked session.
    328. (SELECT 'x' FROM waiting_lock blocked WHERE blocked.pid = blocker.pid)
    329. UNION ALL
    330. SELECT
    331. blocker.seq || blocked.pid,
    332. blocker.depth + 1,
    333. blocker.pid,
    334. blocked.pid,
    335. concat('Connect: ',usename,' ',datname,' ',COALESCE(host(client_addr)||':'||client_port, 'local')
    336. , E'\nSQL: ',REPLACE(substr(COALESCE(query,'N/A'), 1, 60), E'\n', ' ')
    337. , E'\nWaiting: ',blocked.lock_target
    338. , CASE WHEN locks_acquired IS NOT NULL
    339. THEN E'\nAcquired:\n ' ||
    340. array_to_string(locks_acquired[1:5] ||
    341. CASE WHEN array_upper(locks_acquired,1) > 5
    342. THEN '... '||(array_upper(locks_acquired,1) - 5)::text||' more ...'
    343. END,
    344. E'\n ')
    345. END
    346. ) AS lock_info,
    347. concat(to_char(query_start, CASE WHEN age(query_start) > '24h' THEN 'Day DD Mon' ELSE 'HH24:MI:SS' END),E' started\n'
    348. ,CASE WHEN waiting THEN 'waiting' ELSE state END,E'\n'
    349. ,date_trunc('second',age(now(),query_start)),' ago'
    350. ) AS lock_state
    351. FROM blocking_lock blocker
    352. JOIN waiting_lock blocked
    353. ON (blocked.blocker_pid = blocker.pid)
    354. LEFT JOIN pg_stat_activity act ON (act.pid = blocked.pid)
    355. LEFT JOIN acquired_lock acq ON (acq.pid = blocked.pid)
    356. WHERE blocker.depth < 5
    357. )
    358. SELECT concat(lpad('=> ', 4*depth, ' '),pid::text) AS "PID"
    359. , lock_info AS "Lock Info"
    360. , lock_state AS "State"
    361. FROM blocking_lock
    362. ORDER BY seq;
  • Other Operations

    1. -- Dump database on remote host to file
    2. $ pg_dump -U username -h hostname databasename > dump.sql
    3.  
    4. -- Import dump into existing database
    5. $ psql -d newdb -f dump.sql
    6.  
    7. -- kill running query
    8. SELECT pg_cancel_backend(procpid);
    9.  
    10. -- kill idle query
    11. SELECT pg_terminate_backend(procpid);

      

  • postgres upgrading
    1. # Taken from http://robots.thoughtbot.com/post/33706558963/migrating-data-from-an-upgraded-postgres
    2. #
    3. # Note: these steps assume installation with Homebrew.
    4.  
    5. # Initialize a new database, adding a .new suffix to the directory that Homebrew recommends.
    6.  
    7. initdb /usr/local/var/postgres.new -E utf8
    8.  
    9. # Run the upgrade script, providing the correct paths for the various flags.
    10.  
    11. pg_upgrade \
    12. -b /usr/local/Cellar/postgresql/9.1.4/bin \
    13. -B /usr/local/Cellar/postgresql/9.2.1/bin \
    14. -d /usr/local/var/postgres \
    15. -D /usr/local/var/postgres.new
    16.  
    17. # Put the data in the correct place.
    18.  
    19. rm -rf /usr/local/var/postgres
    20. mv /usr/local/var/postgres.new /usr/local/var/postgres
    21.  
    22. # If you’ve set up launchd to run Postgres automatically,
    23. # everything should be up and running! Otherwise, check out the
    24. # documentation with brew info postgres to read how to have OS X
    25. # manage postgres for you.
    26.  
    27. #######
    28.  
    29. # Alternatively, if you’ve just upgraded Postgres with Homebrew and
    30. # Postgres won’t start, as long as you don’t care about any data stored locally:
    31.  
    32. brew remove --force postgresql
    33. rm -rf /usr/local/var/postgres/
    34. brew install postgresql

      

  • postgresql configuration optimization
    1. Memory
    2. Only four values really matter:
    3. shared-buffers: below 2GB: set it to 20% of full memory; below 32GB: 25% of your full memory.
    4. work_mem: Start low at 32/64MB. Look for temporary file lines in logs. Then set it to 2-3x the largest temp file that you see. This setting can give a huge speed boost (if set properly).
    5. maintenance_work_mem: Set it to 10% of system memory.
    6. effective_cache_size: Only a hint to postgres. Just set it to the amount of filesystem cache available.

      

Reference:

  • https://gist.github.com/rgreenjr/3637525
  • https://wiki.postgresql.org/wiki/Lock_dependency_information
  • https://wiki.postgresql.org/wiki/Lock_Monitoring

Postgresql Useful SQL/Commands的更多相关文章

  1. postgreSQL PL/SQL编程学习笔记(六)——杂七杂八

    1 PL/pgSQL Under the Hood This part discusses some implementation details that are frequently import ...

  2. 关于PostgreSQL的SQL注入必知必会

    一.postgresql简介 postgresql是一款关系型数据库,广泛应用在web编程当中,由于其语法与MySQL不尽相同,所以其SQL注入又自成一派. 二.postgresql的SQL注入:(注 ...

  3. postgreSQL PL/SQL编程学习笔记(三)——游标(Cursors)

    Cursors Rather than executing a whole query at once, it is possible to set up a cursor that encapsul ...

  4. postgreSQL PL/SQL编程学习笔记(二)

    Control Structures of PL/SQL Control structures are probably the most useful (and important) part of ...

  5. postgresql 日常sql

    查看服务进程: select pid,usename,client_addr,client_port from pg_stat_activity;   查看当前数据库实例的版本:  select ve ...

  6. PostgreSQL、SQL Server数据库中的数据类型的映射关系

    PostgreSQL 8.1 轰动发布,我也打算将原来使用 SQL Server 的一些应用迁移到 PostgreSQL 上,首先需要迁移的是表,那么这就必须要先搞清楚这两个数据库中的数据类型的映射关 ...

  7. PostgreSQL的SQL语句中的双引号引发的问题

    最近开发一个WEB的ETL工具需要用到不同的数据源.第一次用POSTGRESQL发现一个双引号引发的问题: 标准的SQL是不区分大小写的.但是PostgreSQL对于数据库中对象的名字允许使用支持大小 ...

  8. PostgreSQL 日常SQL记录

    平时用的比较多的SQL语句,有时候会忘掉一点点,在这里记录一下: 1.创建表的同时,插入数据: create table test as select generate_series(1, 10000 ...

  9. postgreSQL PL/SQL编程学习笔记(一)

    1.Structure of PL/pgSQL The structure of PL/pgSQL is like below: [ <<label>> ] [ DECLARE ...

随机推荐

  1. 构造几个死锁的例子(Java )

    目录 构造几个死锁的例子(Java ) 1 2 3 构造几个死锁的例子(Java ) 1 public class Deadlock { public static void main(String[ ...

  2. _string 灵活查询

    $process = (int)$_POST['process']; switch ($process) { case 0: // 全部 $where['_string'] = ' (`sale_wa ...

  3. lombok的@Accessors注解

    @AllArgsConstructor @Data @NoArgsConstructor @Accessors(chain = true) @EqualsAndHashCode public clas ...

  4. gensim中word2vec

    from gensim.models import Word2Vec Word2Vec(self, sentences=None, size=100, alpha=0.025, window=5, m ...

  5. (一)linux 学习 -- 在文件系统中跳转

    The Linux Command Line 读书笔记 - 部分内容来自 http://billie66.github.io/TLCL/book/chap03.html 文章目录 文件系统 根目录 打 ...

  6. Python27之集合

    集合说:“在我的世界里,你就是唯一” 一.集合的概念和使用 集合的概念和数学里数学里集合的概念是一致的,都是一组元素的集,且元素之间不能重复.元素必须是不可变的数据类型,例如元组也可以作为其中的一个元 ...

  7. PowerBuilder学习笔记之导入Excel数据

    原文地址:http://blog.chinaunix.net/uid-20586802-id-3235549.html /*****************简单的导入功能,涉及到数据类型判断***** ...

  8. JAVA基础学习_命名规范和注释

    一.命名规范 1. 项目名全部小写 2. 包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词,包名统一使用单数形式.如果类名有复数含义,类名可以使用复数形式. 实际应用中: 各层命名规约: ...

  9. 在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题)

    原文:在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉 ...

  10. 【ES6】数组的扩展

    1.Array.from(): 将伪数组对象和遍历的对象转为真数组 如果一个对象的键都是正整数或者0,并且有 Length属性,那么这个对象很想数组,称它为伪数组. 伪数组: let obj = { ...