PostgreSQL 数据库管理
1https://www.sjkjc.com/postgresql/administration/0x01 PostgreSQL psql 命令
本文介绍了在 PostgreSQL 提供的 psql 工具中的常用的命令。
psql 工具是 PostgreSQL 提供的一个客户端程序。您能使用 psql 工具管理 PostgreSQL 数据库服务器。 本文整理了常用的 psql 命令,以便您能够更加有效的管理 PostgreSQL 数据库服务器。
连接 PostgreSQL
要使用 psql 工具管理 PostgreSQL 服务器,请先连接到 PostgreSQL 服务器。 命令如下:
1psql -d dbname -U user -W如果您需要连接一个远程的 PostgreSQL 服务器,请使用如下命令:
1psql -h host -p port -d dbname -U user -W其中:
-h参数用于指定远程 PostgreSQL 服务器的主机名或者 IP 地址。 默认值为localhost。-p参数用于指定远程 PostgreSQL 服务器的端口号。默认值为 5432。
psql 常用命令
当您使用 psql 登录进 PostgreSQL 服务器以后,您就可以使用下面的命令管理服务器了。
列出所有的数据库
要列出当前 PostgreSQL 数据库服务器中的所有数据库,请使用 \l 或者 \l+ 命令:
1\l或者
1\l+连接到数据库
连接数据库请使用 \c 或者 \connect 命令。
要使用当前用户连接到新的数据库,请使用如下命令:
1\c dbname要使用新的用户连接到当前数据库,请使用如下命令:
1\c - username您可以是用 \connect 替换上面命令中的 \c,他们是等效的。
列出数据库中的表
要列出当前数据库中的表,请使用 \dt 或者 \dt+ 命令:
1\dt或者
1\dt+显示表结构
要显示一个表的结构或定义,比如 列,约束等信息,请使用 \d 命令:
1\d table_name比如,要查看 product 表的结构,请使用如下命令:
1\d product1testdb=# \d product2 Table "public.product"3 Column | Type | Collation | Nullable | Default4--------------+-------------------+-----------+----------+------------------------------5 id | integer | | not null | generated always as identity6 product_name | character varying | | not null |7 attributes | hstore | | |8Indexes:9 "product_pkey" PRIMARY KEY, btree (id)列出可用模式
要列出当前连接的数据库的所有模式,请使用该 \dn 命令。
1\dn1 List of schemas2 Name | Owner3--------+----------4 public | postgres列出可用的函数
要列出当前数据库中的可用函数,请使用该 \df 命令。
1\df1 List of functions2 Schema | Name | Result data type | Argument data types | Type3--------+--------------------------+--------------------+---------------------------------------------------------+------4 public | akeys | text[] | hstore | func5 public | avals | text[] | hstore | func6 public | defined | boolean | hstore, text | func7 public | delete | hstore | hstore, hstore | func8 public | delete | hstore | hstore, text | func9 public | delete | hstore | hstore, text[] | func10 public | each | SETOF record | hs hstore, OUT key text, OUT value text | func11 public | exist | boolean | hstore, text | func12 public | exists_all | boolean | hstore, text[] | func13 public | exists_any | boolean | hstore, text[] | func14 public | fetchval | text | hstore, text | func15 public | ghstore_compress | internal | internal | func16 public | ghstore_consistent | boolean | internal, hstore, smallint, oid, internal | func17 public | ghstore_decompress | internal | internal | func18 public | ghstore_in | ghstore | cstring | func19 public | ghstore_options | void | internal | func20 public | ghstore_out | cstring | ghstore | func21 public | ghstore_penalty | internal | internal, internal, internal | func22 public | ghstore_picksplit | internal | internal, internal | func23 public | ghstore_same | internal | ghstore, ghstore, internal | func24 public | ghstore_union | ghstore | internal, internal | func25 public | gin_consistent_hstore | boolean | internal, smallint, hstore, integer, internal, internal | func26 public | gin_extract_hstore | internal | hstore, internal | func27 public | gin_extract_hstore_query | internal | hstore, internal, smallint, internal, internal | func28 public | hs_concat | hstore | hstore, hstore | func29 public | hs_contained | boolean | hstore, hstore | func30 public | hs_contains | boolean | hstore, hstore | func31 public | hstore | hstore | record | func32 public | hstore | hstore | text, text | func33 public | hstore | hstore | text[] | func34 public | hstore | hstore | text[], text[] | func35 public | hstore_cmp | integer | hstore, hstore | func36 public | hstore_eq | boolean | hstore, hstore | func37 public | hstore_ge | boolean | hstore, hstore | func38 public | hstore_gt | boolean | hstore, hstore | func39 public | hstore_hash | integer | hstore | func40 public | hstore_hash_extended | bigint | hstore, bigint | func41 public | hstore_in | hstore | cstring | func42 public | hstore_le | boolean | hstore, hstore | func43 public | hstore_lt | boolean | hstore, hstore | func44 public | hstore_ne | boolean | hstore, hstore | func45 public | hstore_out | cstring | hstore | func46 public | hstore_recv | hstore | internal | func47 public | hstore_send | bytea | hstore | func48 public | hstore_subscript_handler | internal | internal | func49 public | hstore_to_array | text[] | hstore | func50 public | hstore_to_json | json | hstore | func51 public | hstore_to_json_loose | json | hstore | func52 public | hstore_to_jsonb | jsonb | hstore | func53 public | hstore_to_jsonb_loose | jsonb | hstore | func54 public | hstore_to_matrix | text[] | hstore | func55 public | hstore_version_diag | integer | hstore | func56 public | isdefined | boolean | hstore, text | func57 public | isexists | boolean | hstore, text | func58 public | my_time_multirange | my_time_multirange | | func59 public | my_time_multirange | my_time_multirange | VARIADIC my_time_range[] | func60 public | my_time_multirange | my_time_multirange | my_time_range | func61 public | my_time_range | my_time_range | time without time zone, time without time zone | func62 public | my_time_range | my_time_range | time without time zone, time without time zone, text | func63 public | populate_record | anyelement | anyelement, hstore | func64 public | skeys | SETOF text | hstore | func65 public | slice | hstore | hstore, text[] | func66 public | slice_array | text[] | hstore, text[] | func67 public | svals | SETOF text | hstore | func68 public | tconvert | hstore | text, text | func69(65 rows)列出可用视图
要列出当前数据库中的可用视图,请使用该 \dv 命令。
1\dv列出用户及其角色
要列出所有用户及其分配的角色,请使用 \du 命令:
1\du1 List of roles2 Role name | Attributes | Member of3-----------+------------------------------------------------------------+-----------4 postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}开启查询执行时间
要打开查询执行时间,请使用该 \timing 命令。
1\timing2select * from product;1 id | product_name | attributes2----+--------------+--------------------------------------------------------------3 2 | Shirt B | "Color"=>"White", "Style"=>"Business", "Season"=>"Spring"4 1 | Computer A | "CPU"=>"2.5", "Disk"=>"1T", "Brand"=>"Dell", "Memory"=>"16G"5(2 rows)6
7Time: 0.281 ms当您再次运行 \timing 命令,则会关闭查询执行时间。
查看命令历史
要显示命令历史记录,请使用该 \s 命令。
1\s如果要将命令历史保存到文件中,则需要在 \s 命令后指定文件名 ,如下所示:
1\s filename执行上一条命令
要想执行最近的一条命令, 请使用 \g 命令:
1\g\g 可让你避免重新输入上一条命令。
获取 SQL 命令的帮助
要获取 SQL 命令的说明,请使用 \h 命令,如下:
1\h sql_command比如,要获取 TRUNCATE 的帮助说明,请使用如下的命令:
1\h TRUNCATE1Command: TRUNCATE2Description: empty a table or set of tables3Syntax:4TRUNCATE [ TABLE ] [ ONLY ] name [ * ] [, ... ]5 [ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]6
7URL: https://www.postgresql.org/docs/14/sql-truncate.html获取 psql 的帮助
要了解 psql 命令的详细用法,请使用 \? 命令
1\?从文件中执行 psql 命令
如果要从文件执行 psql 命令,请 \i 按如下方式使用命令:
1\i filename打开扩展显示
要为 SELECT 语句的结果集打开扩展显示,请使用 \x 命令。
1\x2select * from product;1-[ RECORD 1 ]+-------------------------------------------------------------2id | 23product_name | Shirt B4attributes | "Color"=>"White", "Style"=>"Business", "Season"=>"Spring"5-[ RECORD 2 ]+-------------------------------------------------------------6id | 17product_name | Computer A8attributes | "CPU"=>"2.5", "Disk"=>"1T", "Brand"=>"Dell", "Memory"=>"16G"扩展显示对于显示那些很长的列很有帮助。
如果您再次运行 \x 命令。则回关闭扩展显示。
退出 psql
要退出 psql,您可以使用 \q 命令并按下 enter 退出 psql。
1\q结论
本文向您展示了 psql 工具的常用的命令。
0x02 PostgreSQL 列出数据库
11.查询当前数据库:2
3终端:\c4
5sql语句:select current_database();6
72.查询当前用户:8
9终端:\c10
11sql语句:select user; 或者:select current_user;本文介绍了在 PostgreSQL 列出数据库的两种方法。
PostgreSQL 提供了两种方法列出 PostgreSQL 服务器中的所有数据库:
- 在
psql工具中使用\l或者\l+列出所有的数据库。 - 从
pg_database表中查询所有的数据库。
使用 \l 列出数据库
本实例演示了使用 psql 工具登录数据库并列出数据库的步骤。请按照如下步骤进行:
-
使用 postgres 用户登录 PostgreSQL 服务器:
Terminal window 1[~] psql -U postgres2psql (14.4)3Type "help" for help.注意:您也可以使用其他任何具有相应的数据库权限的用户登录。
-
使用
\l命令列出所有的数据库,如下:1\l1List of databases2Name | Owner | Encoding | Collate | Ctype | Access privileges3-----------+----------+----------+---------+---------+-----------------------4postgres | postgres | UTF8 | C.UTF-8 | C.UTF-8 |5template0 | postgres | UTF8 | C.UTF-8 | C.UTF-8 | =c/postgres +6| | | | | postgres=CTc/postgres7template1 | postgres | UTF8 | C.UTF-8 | C.UTF-8 | =c/postgres +8| | | | | postgres=CTc/postgres9testdb | postgres | UTF8 | C.UTF-8 | C.UTF-8 |10testdb2 | postgres | UTF8 | C.UTF-8 | C.UTF-8 |11(5 rows) -
如果要查看更多关于数据库的信息,请使用
\l+命令,如下:1\l+1List of databases2Name | Owner | Encoding | Collate | Ctype | Access privileges | Size | Tablespace | Description3-----------+----------+----------+---------+---------+-----------------------+---------+------------+--------------------------------------------4postgres | postgres | UTF8 | C.UTF-8 | C.UTF-8 | | 8529 kB | pg_default | default administrative connection database5template0 | postgres | UTF8 | C.UTF-8 | C.UTF-8 | =c/postgres +| 8377 kB | pg_default | unmodifiable empty database6| | | | | postgres=CTc/postgres | | |7template1 | postgres | UTF8 | C.UTF-8 | C.UTF-8 | =c/postgres +| 8529 kB | pg_default | default template for new databases8| | | | | postgres=CTc/postgres | | |9testdb | postgres | UTF8 | C.UTF-8 | C.UTF-8 | | 8897 kB | pg_default |10testdb2 | postgres | UTF8 | C.UTF-8 | C.UTF-8 | | 8545 kB | pg_default |11(5 rows)
您可以看到, \l+ 的输出比 \l 多了 Size, Tablespace 和 Description 列。
从 pg_database 表中查询数据库
除了上面的 \l+ 和 \l 命令,您还可以从 pg_database 表中查询所有的数据库。
pg_database 表是 PostgreSQL 内置的一个表,它存储了所有的数据库。
1SELECT datname FROM pg_database;1 datname2-----------3 postgres4 testdb5 template16 template07 testdb28(5 rows)结论
PostgreSQL 提供了两种方法列出 PostgreSQL 服务器中的所有的数据库中:
- 在
psql工具中使用\l或者\l+列出当所有的数据库。 - 从
pg_database表中查询所有的数据库。
在 MySQL 中,您可以使用 SHOW DATABASES 命令列出数据库。
0x03 PostgreSQL 复制数据库
本文介绍了在 PostgreSQL 中复制数据库的几种方法
在 PostgreSQL 中,您可以使用以下几种方法复制数据库:
- 使用
CREATE DATABASE从模板数据库复制一个数据库。此方法仅适用于在同一个 PostgreSQL 服务器内操作。 - 备份一个现有的数据库,并将其恢复到一个新的数据库。
从模板数据库复制数据库
有时候,为了数据的安全性,您在操作之前需要先将要操作数据库复制备份。 您可以使用 CREATE DATABASE 将此数据库复制为一个新数据库,如下:
1CREATE DATABASE new_db2WITH TEMPLATE old_db;此语句将 复制 old_db 数据库到 new_db 数据库。 old_db 必须是模板数据库才能被复制。如果它不是模板数据库,您可以使用 ALTER DATABASE 语句将此数据库修改为模板数据库,如下:
1ALTER DATABASE old_db WITH IS_TEMPLATE true;此方法仅能用在同一个 PostgreSQL 数据库服务器内。如果您想在不同的 PostgreSQL 数据库服务器间复制数据库,请查看 PostgreSQL 备份和恢复教程。
结论
PostgreSQL 允许您使用 CREATE DATABASE 语句复制一个模板数据库。
0x04 PostgreSQL 查看空间
本文介绍了在 PostgreSQL 如何查看数据库、表、索引和表空间的大小。
作为数据库管理者,您经常需要查看数据库的占用空间,这包括 数据库、表、索引和表空间的大小,以便为他们分配合理的存储空间。
PostgreSQL 数据库大小
您可以使用 pg_database_size() 函数获取整个数据库的大小。例如,以下语句返回 testdb 数据库的大小:
1SELECT pg_database_size('testdb');1 pg_database_size2------------------3 9044483pg_database_size() 函数以字节为单位返回数据库的大小,这不容易阅读。您可以使用 pg_size_pretty() 函数将字节转为更易于阅读值。如下:
1SELECT2 pg_size_pretty(3 pg_database_size('testdb')4 );该语句返回以下结果:
1 pg_size_pretty2----------------3 8833 kB如果您想要要获取当前数据库服务器中所有数据库的大小,请使用以下语句:
1SELECT2 datname,3 pg_size_pretty(pg_database_size(datname)) AS size4 FROM pg_database;1 datname | size2-------------+---------3 postgres | 8561 kB4 template1 | 8401 kB5 template0 | 8401 kB6 testdb | 8833 kB7 sakila | 16 MB8 testdb2 | 8521 kB9 test_new_db | 8401 kBPostgreSQL 表大小
您可以使用 pg_relation_size() 函数获取一个表的大小。例如,以下语句返回 Sakila 示例数据库中的 actor 表的大小:
1SELECT2 pg_size_pretty(3 pg_relation_size('actor')4 );1 pg_size_pretty2----------------3 16 kBpg_relation_size() 函数返回表的数据的大小,不包含表中的索引的大小。如果要获取表的总的大小,请使用 pg_total_relation_size() 函数, 如下:
1SELECT2 pg_size_pretty(3 pg_total_relation_size('actor')4 );1 pg_size_pretty2----------------3 72 kB要获取数据库中所有的表的大小,您可以使用如下语句:
1SELECT2 tablename,3 pg_size_pretty(pg_total_relation_size('actor')) size4FROM pg_tables5WHERE schemaname = 'public';1 tablename | size2----------------------+-------3 actor | 72 kB4 film | 72 kB5 payment_p2007_02 | 72 kB6 payment_p2007_03 | 72 kB7 payment_p2007_04 | 72 kB8 payment_p2007_05 | 72 kB9 payment_p2007_06 | 72 kB10 payment_p2007_01 | 72 kB11 address | 72 kB12 category | 72 kB13 city | 72 kB14 country | 72 kB15 customer | 72 kB16 film_actor | 72 kB17 film_category | 72 kB18 inventory | 72 kB19 language | 72 kB20 rental | 72 kB21 staff | 72 kB22 store | 72 kB23 payment | 72 kB24 film_copy | 72 kB25 city_copy | 72 kB26 film_r | 72 kB27 film_ranting_g_title | 72 kBPostgreSQL 索引大小
PostgreSQL pg_indexes_size() 函数用于获取一个指定表上的索引的大小。例如,要获取 actor 表的所有索引的总大小,请使用以下语句:
1SELECT2 pg_size_pretty(3 pg_indexes_size('actor')4 );1 pg_size_pretty2----------------3 32 kBPostgreSQL 表空间大小
PostgreSQL pg_tablespace_size() 函数用于获取一个指定的表空间的大小。
以下语句返回 pg_default 表空间的大小:
1SELECT2 pg_size_pretty (3 pg_tablespace_size('pg_default')4 );1 pg_size_pretty2----------------3 67 MBPostgreSQL 值大小
PostgreSQL pg_column_size() 函数用于获取指定的值占用的空间,例如:
以下语句返回一个 smallint 类型的值的大小:
1select pg_column_size(1::smallint);1 pg_column_size2----------------3 2以下语句返回一个 int 类型的值的大小:
1select pg_column_size(1::int);1 pg_column_size2----------------3 4以下语句返回一个 bigint 类型的值的大小:
1select pg_column_size(1::bigint);1 pg_column_size2----------------3 8结论
本文讲述了几个的函数来获取数据库、表、索引、表空间和值的大小。
0x05 PostgreSQL 列出表
本文介绍了在 PostgreSQL 列出数据库中的表的两种方法。
PostgreSQL 提供了两种方法列出一个数据库中的所有表:
- 在
psql工具中使用\dt或者\dt+列出当前当前数据库中的所有的表。 - 从
pg_tables表中查询所有的表。
使用 \dt 列出数据库中的表
本实例演示了使用 psql 工具登录数据库并列出数据库中表的过程。请按照如下步骤进行:
-
使用 postgres 用户登录 PostgreSQL 服务器:
Terminal window 1[~] psql -U postgres2psql (14.4)3Type "help" for help.注意:您也可以使用其他任何具有相应的数据库权限的用户登录。
-
使用以下语句选择
testdb数据库:1\c testdb;如果还未创建数据库,请先运行如下语句:
1CREATE DATABASE testdb; -
使用
\dt命令列出testdb数据库中的所有的表,如下:1\dt1List of relations2Schema | Name | Type | Owner3--------+----------------+-------+----------4public | mytable | table | postgres5public | product | table | postgres6public | test_date | table | postgres7public | test_time | table | postgres8public | test_timestamp | table | postgres9public | week_day_sales | table | postgres10(6 rows) -
如果要查看更多关于表的信息,请使用
\dt+命令,如下:1\dt+1List of relations2Schema | Name | Type | Owner | Persistence | Access method | Size | Description3--------+----------------+-------+----------+-------------+---------------+------------+-------------4public | mytable | table | postgres | permanent | heap | 16 kB |5public | product | table | postgres | permanent | heap | 16 kB |6public | test_date | table | postgres | permanent | heap | 8192 bytes |7public | test_time | table | postgres | permanent | heap | 8192 bytes |8public | test_timestamp | table | postgres | permanent | heap | 8192 bytes |9public | week_day_sales | table | postgres | permanent | heap | 8192 bytes |10(6 rows)
您可以看到, \dt+ 的输入比 \dt 输出多了 Persistence, Access method, Size 和 Description 列。
从 pg_tables 表中查询表
除了上面的 \dt 和 \dt+ 命令,您还可以从 pg_tables 表中查询当前数据中的所有的表。
pg_tables 表是 PostgreSQL 内置的一个表,它存储了数据库中的所有的表。
1SELECT * FROM pg_tables2WHERE schemaname = 'public';1 schemaname | tablename | tableowner | tablespace | hasindexes | hasrules | hastriggers | rowsecurity2------------+----------------+------------+------------+------------+----------+-------------+-------------3 public | test_date | postgres | | t | f | f | f4 public | test_time | postgres | | t | f | f | f5 public | test_timestamp | postgres | | t | f | f | f6 public | week_day_sales | postgres | | t | f | f | f7 public | mytable | postgres | | f | f | f | f8 public | product | postgres | | t | f | f | f9(6 rows)结论
PostgreSQL 提供了两种方法列出一个数据库中的所有表:
- 在
psql工具中使用\dt或者\dt+列出当前数据库中的所有的表。 - 从
pg_tables表中查询所有的表。
在 MySQL 中,您可以使用 SHOW TABLES 命令列出数据库。
0x06 PostgreSQL 查看表
本文介绍了在 PostgreSQL 查看数据表的定义或结构的两种方法。
PostgreSQL 提供了两种方法查看一个现有的表的定义或者结构:
- 在
psql工具中使用\d或者\d+列出当前数据库中的所有的表。 - 从
information_schema.columns中查询表中的列。
使用 \d 查看表的信息
本实例演示了使用 psql 工具登录数据库并查看表信息的详细步骤。请按照如下步骤进行:
-
使用 postgres 用户登录 PostgreSQL 服务器:
Terminal window 1[~] psql -U postgres2psql (14.4)3Type "help" for help.注意:您也可以使用其他任何具有相应的数据库权限的用户登录。
-
使用以下语句选择
testdb数据库:1\c testdb;如果还未创建数据库,请先运行如下语句:
1CREATE DATABASE testdb; -
以下语句使用
\d命令查看test_date表的结构,如下:1\d test_date1Table "public.test_date"2Column | Type | Collation | Nullable | Default3------------+---------+-----------+----------+------------------------------4id | integer | | not null | generated always as identity5date_value | date | | not null | CURRENT_DATE6Indexes:7"test_date_pkey" PRIMARY KEY, btree (id)您可以看到,
\d输出了表的名字、表中的列,表中的约束等信息。 -
如果要查看更多关于
test_date表的信息,请使用\d+命令,如下:1\d+ test_date1Table "public.test_date"2Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description3------------+---------+-----------+----------+------------------------------+---------+-------------+--------------+-------------4id | integer | | not null | generated always as identity | plain | | |5date_value | date | | not null | CURRENT_DATE | plain | | |6Indexes:7"test_date_pkey" PRIMARY KEY, btree (id)8Access method: heap您可以看到,
\d+的输入比\d输出多了Compression,Stats target和Description列。
从 information_schema 中查看表中的所有列
information_schema 是一个系统级的 Schema, 其中提供了一些视图可以查看表、列、索引、函数等信息。
该 information_schema.columns 目录包含有关所有表的列的信息。
以下语句从 information_schema.columns 中查询 test_date 表的所有的列:
1SELECT2 table_name,3 column_name,4 data_type,5 column_default6FROM7 information_schema.columns8WHERE9 table_name = 'test_date';1 table_name | column_name | data_type | column_default2------------+-------------+-----------+----------------3 test_date | id | integer |4 test_date | date_value | date | CURRENT_DATE5(2 rows)以上语句返回了 test_date 表的所有的列的信息,包括 列名,数据类型,默认值。
结论
PostgreSQL 提供了两种方法查看一个现有的表的定义或者结构:
- 在
psql工具中使用\d或者\d+列出当前当前数据库中的所有的表。 - 从
information_schema.columns中查询表中的列。
在 MySQL 中,您可以使用 DESCRIBE 命令列出查看表中的列。
0x07 PostgreSQL 复制表
本文介绍了在 PostgreSQL 中复制表的几种方法
在 PostgreSQL 中,您可以使用以下几种方法复制一个表到一个新表:
- 使用
CREATE TABLE ... AS TABLE ...语句复制一个表。 - 使用
CREATE TABLE ... AS SELECT ...语句复制一个表。 - 使用
SELECT ... INTO ...语句复制一个表。
使用 CREATE TABLE ... AS TABLE ... 语句复制一个表
要将已有的 table_name 表复制为新表 new_table,包括表结构和数据,请使用以下语句:
1CREATE TABLE new_table2AS TABLE table_name;如果仅复制表结构,不复制数据,请在以上 CREATE TABLE 语句中添加 WITH NO DATA 子句,如下所示:
1CREATE TABLE new_table2AS TABLE table_name3WITH NO DATA;使用 CREATE TABLE ... AS SELECT ... 语句复制一个表
您还可以使用 CREATE TABLE ... AS SELECT ... 语句复制一个表。 这种方法可以复制部分数据到新表中。
要将已有的 table_name 表复制为新表 new_table,包括表结构和数据,请使用以下语句:
1CREATE TABLE new_table AS2SELECT * FROM table_name;如果您只需要复制部分满足条件的数据,请在 SELECT 语句中添加 WHERE 子句,如下:
1CREATE TABLE new_table AS2SELECT * FROM table_name3WHERE contidion;如果您只需要复制部分列到新表,请在 SELECT 语句中指定要复制的列的列表,如下:
1CREATE TABLE new_table AS2SELECT column1, column2, ... FROM table_name3WHERE contidion;如果您只需要复制表结构,请按如下方式使用 WHERE 子句:
1CREATE TABLE new_table AS2SELECT * FROM table_name3WHERE 1 = 2;这里在 WHERE 子句中使用了一个永远为假的条件。
使用 SELECT ... INTO ... 语句复制一个表
要使用 PostgreSQL SELECT INTO 语句将已有的 table_name 表复制为新表 new_table,请使用以下语法:
1SELECT *2INTO new_table3FROM table_name如果您只需要复制部分满足条件的数据,请添加 WHERE 子句,如下:
1SELECT *2INTO new_table3FROM table_name4WHERE contidion;如果您只需要复制部分列到新表,请在 SELECT 语句中指定要复制的列的列表,如下:
1SELECT column1, column2, ...2INTO new_table3FROM table_name4WHERE contidion;结论
本文阐述了在 PostgreSQL 中复制表的几种方法。注意,这几种方法都只能复制列的定义和数据,都不能将索引复制过去。
0x08 PostgreSQL 备份和恢复
本文介绍如何使用 pg_dump 和 pg_dumpall 备份 PostgreSQL 数据库以及如何使用 pg_restore 恢复 PostgreSQL 数据库。
PostgreSQL 提供了 pg_dump 和 pg_dumpall 工具,帮助您轻松地备份数据库,同时,PostgreSQL 提供了 pg_restore 工具,帮助您轻松的恢复数据库。
作为数据库管理员,备份和恢复是必备的技能。 PostgreSQL 为我们提供了很多方便的工具或命令来做到这些。
备份数据库的工具或命令:
pg_dump工具用于备份单个 PostgreSQL 数据库pg_dumpall工具用于备份 PostgreSQL 服务器中的所有的数据库。
恢复数据库的工具或命令:
pg_restore工具用于恢复由pg_dump工具产生的 tar 文档和目录文档。psql工具可以导入pg_dump和pg_dumpall工具产生的 SQL 脚本文件。\i命令可以导入pg_dump和pg_dumpall工具产生的 SQL 脚本文件。
使用 pg_dump 备份一个数据库
PostgreSQL 自带了 pg_dump 工具用于备份单个 PostgreSQL 数据库。 以下是一个常用的备份命令:
1pg_dump -U username -W -F t db_name > output.tar说明:
-U username: 指定连接 PostgreSQL 数据库服务器的用户。您可以在username位置使用自己的用户名。-W: 强制pg_dump在连接到 PostgreSQL 数据库服务器之前提示输入密码。按回车后,pg_dump会提示输入postgres用户密码。-F: 指定输出文件的格式,它可以是以下格式之一:c: 自定义格式d: 目录格式存档t: tar 文件包p: SQL 脚本文件
db_name是要备份的数据库的名字。output.tar是输出文件的路径。
如果您在命令行或者终端工具中运行命令是提示找不到 pg_dump 工具,请先导航到 PostgreSQL bin 文件夹。例如:
1C:\>cd C:\Program Files\PostgreSQL\14\bin使用 pg_dumpall 备份所有数据库
除了 pg_dump 工具,PostgreSQL 还提供了可以一次备份所有数据库的 pg_dumpall 工具备份。 该 pg_dumpall 工具的用法如下:
1pg_dumpall -U username > output.sql使用 pg_restore 恢复数据库
PostgreSQL 提供了 pg_restore 工具用于恢复由 pg_dump 工具产生的 tar 文档和目录文档。
pg_restore 工具的用法如下:
1pg_restore [option...] file_path说明:
-
file_path是要恢复的文件或者目录的路径。 -
1option
是一些恢复数据时用到的参数,比如,数据库,主机,端口 等。 您可以使用如下选项:
参数 说明 -a--data-only只恢复数据,而不恢复表模式(数据定义)。 -c--clean创建数据库对象前先清理(删除)它们。 -C--create在恢复数据库之前先创建它。 -d dbname--dbname=dbname与数据库 dbname 联接并且直接恢复到该数据库中。 -e--exit-on-error如果在向数据库发送 SQL 命令的时候碰到错误,则退出。缺省是继续执行并且在恢复 结束时显示一个错误计数。 -f filename--file=filename声明生成的脚本的输出文件,或者出现-l 选项时用于列表的文件,缺省是标准输出。 -F format--format=format声明备份文件的格式。 -i--ignore-version忽略数据库版本检查。 -I index--index=index只恢复命名的索引。 -l--list列出备份的内容。这个操作的输出可以用 -L 选项限制和重排所恢复的项目。 -L list-file--use-list=list-file只恢复在 list-file 里面的元素,以它们在文件中出现的顺序。 -n namespace--schema=schema只恢复指定名字的模式里面的定义和/或数据。不要和 -s 选项混淆。这个选项可以和 -t 选项一起使用。 -O--no-owner不要输出设置对象的权限,以便与最初的数据库匹配的命令。 -s--schema-only只恢复表结构(数据定义)。不恢复数据,序列值将重置。 -S username--superuser=username设置关闭触发器时声明超级用户的用户名。只有在设置了 –disable-triggers 的时候 才有用。 -t table--table=table只恢复表指定的表的定义和/或数据。 -T trigger--trigger=trigger只恢复指定的触发器。 -v--verbose声明冗余模式。 -x--no-privileges--no-acl避免 ACL 的恢复(grant/revoke 命令) -X use-set-session-authorization--use-set-session-authorization输出 SQL 标准的 SET SESSION AUTHORIZATION 命令,而不是 OWNER TO 命令。 -X disable-triggers--disable-triggers这个选项只有在执行仅恢复数据的时候才相关。 -h host--host=host声明服务器运行的机器的主机名。 -p port--port=port声明服务器侦听的 TCP 端口或者本地的 Unix 域套接字文件扩展。 -U username以给出用户身分联接。 -W强制给出口令提示。如果服务器要求口令认证,那么这个应该自动发生。
最常用的 pg_restore 用法如下:
1pg_restore -d db_name path_to_db_backup_file.tar如何使用 psql 恢复数据库
您可以使用 psql 工具从一个 sql 文件中恢复数据。 以下是使用 psql 从 sql 文件恢复数据的基本用法:
1psql -U username -f path_to_db_backup_file.sql使用 \i 命令导入 sql 文件
您还可以 \i 命令导入 sql 文件。 以下演示了导入 sakila 示例数据库的步骤:
-
启动 psql 工具并连接 PostgreSQL 服务器:
Terminal window 1.\psql.exe -U postgres根据提示输入 postgres 用户的密码,然后按下回车键。
-
创建 sakila 数据库
1CREATE DATABASE sakila; -
连接 sakila 数据库
1\c sakila; -
分别使用以下两个语句以导入刚刚下载的两个文件
postgres-sakila-schema.sql和postgres-sakila-insert-data.sql:1\i C:/Users/Adam/Downloads/postgres-sakila-schema.sql2\i C:/Users/Adam/Downloads/postgres-sakila-insert-data.sql请注意,请使用
/替换文件路径中的\。
结论
本文讨论了备份和恢复 PostgreSQL 数据库的几种方法。
部分信息可能已经过时