****
postgresqlデータベースのDBAの運用と保守で頻繁に使用されるコマンド
****
記事のディレクトリ
(継続更新)
最近、postgresqlデータベースを管理し、よく使うコマンドやSQL文を整理しています。
postgresql11の一般的なコマンド
**
1.デッドロック
**
postgresql自体が原因で、一部のテーブルがロックされることがよくあります
1.クエリロック
select w1.pid as 等待进程,
w1.mode as 等待锁模式,
w2.usename as 等待用户,
w2.query as 等待会话,
b1.pid as 锁的进程,
b1.mode 锁的锁模式,
b2.usename as 锁的用户,
b2.query as 锁的会话,
b2.application_name 锁的应用,
b2.client_addr 锁的IP地址,
b2.query_start 锁的语句执行时间
from pg_locks w1
join pg_stat_activity w2 on w1.pid=w2.pid
join pg_locks b1 on w1.transactionid=b1.transactionid and w1.pid!=b1.pid
join pg_stat_activity b2 on b1.pid=b2.pid
where not w1.granted;
2.デッドロックプロセスを強制終了します
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE pid='62560'
それでもセッションを強制終了できない場合は、オペレーティングシステムレベルで直接強制終了できます
****
2.実行中のプロセスを表示します
****
サーバーの監視に使用され、プロセスを照会でき、時間の消費はロックに関連しています
SELECT
C.relname 对象名称,
l.locktype 可锁对象的类型,
l.pid 进程id,
l.MODE 持有的锁模式,
l.GRANTED 是否已经对锁进行授权,
l.fastpath,
psa.datname 数据库名称,
psa.usesysid 用户id,
psa.usename 用户名称,
psa.application_name 应用程序名称,
psa.client_addr 连接的IP地址,
psa.client_port 连接使用的TCP端口号,
psa.backend_start 进程开始时间,
psa.xact_start 事务开始时间,
psa.query_start 事务执行此语句时间,
psa.state_change 事务状态改变时间,
psa.wait_event_type 等待事件类型,
psa.wait_event 等待事件,
psa.STATE 查询状态,
backend_xid 事务是否有写入操作,
backend_xmin 是否执事务快照,
psa.query 执行语句,
now( ) - query_start 持续时间
FROM
pg_locks l
INNER JOIN pg_stat_activity psa ON ( psa.pid = l.pid )
LEFT OUTER JOIN pg_class C ON ( l.relation = C.oid )
-- where l.relation = 'tb_base_apparatus'::regclass
where relkind ='r'
ORDER BY query_start asc
3つのPostgreSqlクエリデータベース、インデックス、テーブル、テーブルスペースサイズ
-表スペースのサイズを照会します
select pg_size_pretty(pg_tablespace_size('pg_default'));
-すべてのデータベースのサイズを照会する
select pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) AS size from pg_databas;
-指定されたインデックスサイズをクエリします
select pg_size_pretty(pg_relation_size('dotime'));
-指定されたテーブルのすべてのインデックスのサイズをクエリします
select pg_size_pretty(pg_indexes_size('tb_sys_loginfo'));
–指定されたスキーマのすべてのインデックスサイズを降順でクエリします。
select relname,indexrelname, pg_size_pretty(pg_relation_size(relid)) from pg_stat_user_indexes where schemaname='public' order by pg_relation_size(relid) desc;
-指定されたテーブルサイズをクエリします(指定されたテーブルデータのみ)
select pg_size_pretty(pg_relation_size('tb_sys_loginfo'));
-指定されたテーブルの合計サイズ(テーブルデータとインデックスを含む)をクエリします
select pg_size_pretty(pg_total_relation_size('tb_sys_loginfo'));
-指定されたスキーマ内のすべてのテーブルのサイズをクエリします(大から小まで、指定されたテーブルデータのみ)
select relname, pg_size_pretty(pg_relation_size(relid)) from pg_stat_user_tables where schemaname='public' order by pg_relation_size(relid) desc;
-指定されたスキーマのすべてのテーブルのデータサイズ、合計インデックスサイズ、合計サイズ、行数をクエリします
SELECT
table_size.relname 表名,
pg_size_pretty ( pg_relation_size ( relid ) ) 表数据大小,
pg_size_pretty ( pg_indexes_size ( relid ) ) 表总索引大小,
pg_size_pretty ( pg_total_relation_size ( relid ) ) 表总大小,
表行数
FROM
pg_stat_user_tables table_size
LEFT JOIN (
SELECT
relname,
reltuples :: DECIMAL ( 19, 0 ) 表行数
FROM
pg_class r
JOIN pg_namespace n ON ( relnamespace = n.oid )
WHERE
relkind = 'r'
AND n.nspname = 'public'
) table_num ON table_num.relname = table_size.relname
WHERE
schemaname = 'public'
ORDER BY
pg_relation_size ( relid ) DESC;
****
4クエリ外部サーバー
****
select * from pg_foreign_server;
****
5つはすべてのデータベース接続を強制終了します
****
SELECT
pg_terminate_backend(pid)
FROM
pg_stat_activity
WHERE
-- don't kill my own connection
pid <> pg_backend_pid()
-- don't kill the connections to other databases
AND datname = '库名'
;
****
6人がサービスを再開します
****
--启动服务:
systemctl start postgresql-11
--停止服务:
systemctl stop postgresql-11
--重启服务:
systemctl restart postgresql-11
--查看pgagent_11服务
systemctl enable pgagent_11
systemctl status pgagent_11
systemctl start pgagent_11
****
7つのバックアップと復元
****
1.データベースをバックアップします
pg_dump --file "/home/back/pgsql-all-"$(date +%F+%T)".backup" --host "0.0.0.11" --port "5432" --username "postgres" --dbname "postgres" --verbose --role "postgres" --format=c --blobs --encoding "UTF8"
2.データベースを復元します
pg_restore --username "postgres" --no-password --role "postgres" --dbname "hrmwv2" --verbose /home/back/pgsql-all-postgres-2020-07-22+11:03:28.backup
データベース構成を再ロードするには、次の3つの方法があります。
1.スーパーユーザーとして実行
postgres=# SELECT pg_reload_conf();
2. UNIXキルを使用して、HUPシグナルを手動で開始します
$ kill -HUP PID
3. pg_ctlコマンドを使用して、SIGHUPシグナルをトリガーします
$ pg_ctlリロード