PostgreSQL 日常SQL記錄


平時用的比較多的SQL語句,有時候會忘掉一點點,在這里記錄一下:

 

1.創建表的同時,插入數據:

create table test as select generate_series(1, 1000000) as id, cast(random() as text) as info , now() as crt_time;

mydb=# create table test as select generate_series(1, 1000000) as id, cast(random() as text) as info , now() as crt_time;
SELECT 1000000
mydb=# \d test
Table "public.test"
Column | Type | Modifiers
----------+--------------------------+-----------
id | integer |
info | text |
crt_time | timestamp with time zone |

mydb=> select pg_relation_filepath('test1');
pg_relation_filepath
----------------------------------------------
pg_tblspc/16474/PG_9.5_201510051/16475/16477

(1 row)

mydb=> select pg_size_pretty(pg_relation_size('test1'));
pg_size_pretty
----------------
5888 kB
(1 row)

 

2.創建及查看數據庫的表空間

select oid, * from pg_tablespace where oid in (select dattablespace from pg_database where datname='mydb');

postgres=# create tablespace mydb location '/var/lib/pgsql/mydb_tbspace';

CREATE TABLESPACE
postgres=# \db 
List of tablespaces Name | Owner | Location ------------+----------+----------------------------- mydb | postgres | /var/lib/pgsql/mydb_tbspace pg_default | postgres | pg_global | postgres | (3 rows) postgres=# create database mydb encoding='utf-8' tablespace = mydb; CREATE DATABASE postgres=# select oid, * from pg_tablespace where oid in (select dattablespace from pg_database where datname='mydb'); oid | spcname | spcowner | spcacl | spcoptions -------+---------+----------+--------+------------ 16474 | mydb | 10 | | (1 row)

 

 

添加一些別的,有部分為轉載:

查看服務進程: 

select pid,usename,client_addr,client_port from pg_stat_activity;
 
查看當前數據庫實例的版本:
 select version(); 
 
查看數據庫的啟動時間:
select pg_postmaster_start_time();
 
查看最后load配置文件的時間:
select pg_conf_load_time();
 
顯示當前數據庫時區:
show timezone;
 
postgres=# show timezone;
 TimeZone 
----------
 PRC
(1 row)
 
postgres=# select now();
              now              
-------------------------------
 2015-07-10 16:27:59.692621+08
(1 row)
 
顯示實例中有哪些數據庫:
postgres=# \l   或者 [postgre@pg-1 ~]$ psql -l
 
查看當前用戶名:
select user;
或者
select current_user;
 
查看session用戶:
 select session_user;
 
查詢當前連接的數據庫名稱:
postgres=# select current_catalog,current_database();
 current_database | current_database 
------------------+------------------
 postgres         | postgres
(1 row)
 
查詢當前session所在客戶端的IP地址及端口:
 select inet_client_addr(),inet_client_port();
 
查詢到當前數據庫服務器的IP地址及端口:
 select inet_server_addr(),inet_server_port();
 
查詢當前session的后台服務進程的pid:
postgres=# select pg_backend_pid();
 pg_backend_pid 
----------------
          12504
(1 row)
通過操作系統命令看下此后台進程:
[root@pg-1 postgresql-9.4.4]# ps -ef |grep  12504 |grep -v grep
postgre  12504  1590  0 16:34 ?        00:00:00 postgres: postgre postgres [local] idle
 
查看當前正在寫的WAL文件:
postgres=# select pg_xlogfile_name(pg_current_xlog_location());
     pg_xlogfile_name     
--------------------------
 000000010000000000000001
(1 row)
 
查看當前WAL的buffer中還有多少字節的數據沒有寫到磁盤中:
postgres=# select pg_xlog_location_diff(pg_current_xlog_insert_location(),pg_current_xlog_location());
 pg_xlog_location_diff 
-----------------------
                     0
(1 row)
 
查看數據庫實例是否在做基礎備份:
postgres=# select pg_is_in_backup(),pg_backup_start_time();
 pg_is_in_backup | pg_backup_start_time 
-----------------+----------------------
 f               | 
(1 row)
 
查看當前數據庫實例是Hot Standby狀態還是正常數據庫狀態:
postgres=# select pg_is_in_recovery();
 pg_is_in_recovery 
-------------------
 f
(1 row)
 
查看數據庫大小:
postgres=# select pg_database_size('pgtest'),pg_size_pretty(pg_database_size('pgtest'));
 pg_database_size | pg_size_pretty 
------------------+----------------
          6998688 | 6835 kB
(1 row)
注:如果數據庫中有很多表,使用上述命令將比較慢,也可能對當前系統產生不利的影響。pg_size_pretty()函數會把數字以MB、GB等格式顯示出來,這樣會更直觀。
 
查看表的大小:
pgtest=# select pg_size_pretty(pg_relation_size('test01'));
 pg_size_pretty 
----------------
 8192 bytes
(1 row)
注:僅計算表的大小,不包括索引的大小;
 
pgtest=# select pg_size_pretty(pg_total_relation_size('test01'));
 pg_size_pretty 
----------------
 24 kB
(1 row)
 
注:包括索引大小
 
查看表上所有索引的大小:
pgtest=# select pg_size_pretty(pg_indexes_size('test01'));
 pg_size_pretty 
----------------
 16 kB
(1 row)
 
查看表空間的大小:
pgtest=# select pg_size_pretty(pg_tablespace_size('pg_global'));
 pg_size_pretty 
----------------
 437 kB
(1 row)
 
查看表對應的數據文件:
pgtest=# select pg_relation_filepath('test01');
 pg_relation_filepath 
----------------------
 base/16403/16410
(1 row)
 
修改postgresql.conf后,讓修改生效的方法有兩種:
1)在操作系統下使用:pg_ctl   reload
2) 在psql中使用:select pg_reload_conf();
pgtest=# select pg_reload_conf();
 pg_reload_conf 
----------------
 t
(1 row)
 
pgtest=# select pg_conf_load_time();
       pg_conf_load_time       
-------------------------------
 2015-07-10 17:44:45.620045+08
(1 row)
 
注:如果需要重啟數據庫服務的配置項,修改后使用上面的方法並不能使之生效。
 
切換log日志到下一個的命令:
postgres=# select pg_rotate_logfile();
 pg_rotate_logfile 
-------------------
 t
(1 row)
 
切換WAL日志文件:
postgres=# select pg_switch_xlog();
 pg_switch_xlog 
----------------
 0/17AF678 
(1 row)
 
收工生成一次checkpoint:
postgres=# checkpoint;
CHECKPOINT
 
 
取消一個正在長時間執行的SQL方法:
有兩個函數可以完成這個功能:
1)pg_cancel_backend(pid):取消一個正在執行的SQL;
2)pg_terminate_backend(pid):終止一個后台服務進程,同時釋放此后台服務進程的資源。
這兩個函數的區別是:pg_cancel_backend()函數實際上是給正在執行的SQL任務配置一個取消標志,正在執行的任務是在合適的時候檢測到此標志后主動退出;但如果這個任務沒有主動檢測到這個標志,則該任務就無法正常退出,這時需要使用pg_terminate_backend()命令在終止SQL的執行。
通常是先查詢pg_stat_activity,試圖找出長時間運行的SQL:
postgres=# select pid,usename,query_start,query from pg_stat_activity ;
 pid  | usename |          query_start          |                            query                             
------+---------+-------------------------------+--------------------------------------------------------------
 1651 | postgre | 2015-07-11 15:35:39.745907+08 | select pid,usename,query_start,query from pg_stat_activity ;
 1722 | postgre | 2015-07-11 15:35:17.114117+08 | select pg_sleep(100);
(2 rows)
 
然后在使用pg_cancel_backend()取消這個SQL,如果pg_cancel_backend()取消不了,再使用pg_terminate_backend():
 
  postgres=# select pid,usename,query_start,query from pg_stat_activity ;
 pid  | usename |          query_start          |                            query                             
------+---------+-------------------------------+--------------------------------------------------------------
 1651 | postgre | 2015-07-11 15:40:11.085173+08 | select pid,usename,query_start,query from pg_stat_activity ;
 1747 | postgre | 2015-07-11 15:40:04.277972+08 | select pg_sleep(100);
(2 rows)
 
postgres=# select pg_cancel_backend(1747);
 pg_cancel_backend 
-------------------
 t
(1 row)
 
postgres=# select pid,usename,query_start,query from pg_stat_activity ;
 pid  | usename |          query_start          |                            query                             
------+---------+-------------------------------+--------------------------------------------------------------
 1651 | postgre | 2015-07-11 15:40:26.885772+08 | select pid,usename,query_start,query from pg_stat_activity ;
 1747 | postgre | 2015-07-11 15:40:04.277972+08 | select pg_sleep(100);
(2 rows)
 
 
 
 postgres=# select pg_terminate_backend(1747);
 pg_terminate_backend 
----------------------
 t
(1 row)
 
postgres=# select pid,usename,query_start,query from pg_stat_activity ;
 pid  | usename |          query_start          |                            query                             
------+---------+-------------------------------+--------------------------------------------------------------
 1651 | postgre | 2015-07-11 15:41:09.413959+08 | select pid,usename,query_start,query from pg_stat_activity ;
(1 row)
 
 
 
 
[postgre@pg-1 pg_log]$ pg_basebackup   -D backup     -Ft -z -P  
pg_basebackup: could not connect to server: FATAL:  number of requested standby connections exceeds max_wal_senders (currently 0)
由於沒有設置max_wal_senders參數,修改postgresql.conf
max_wal_senders = 2
wal_level = hot_standby 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM