跳到主要内容

Docker-Pgsql

1. Docker安装

# 创建Network
docker network create dev

# 创建数据卷
docker volume create pgsql_data;

# 创建文件夹
mkdir -p D:/docker/pgsql/{conf,data,logs}

# docker run -i --rm postgres cat /usr/share/postgresql/postgresql.conf.sample > D:/docker/pgsql/conf/postgresql.conf

# 获取默认配置文件
docker run -d --name postgres_temp postgres:15.3 \
&& docker cp postgres_temp:/usr/share/postgresql/postgresql.conf.sample D:/docker/pgsql/conf/postgresql.conf \
&& docker stop postgres_temp && docker rm postgres_temp

# 运行容器
docker run -d \
--publish 5432:5432 \
--volume //d/docker/pgsql/data:/var/lib/postgresql/data \
--volume //d/docker/pgsql/conf/postgresql.conf:/etc/postgresql/postgresql.conf:ro \
--env PGDATA=/var/lib/postgresql/data \
--env POSTGRES_PASSWORD=postgres \
--net dev \
--restart=no \
--name postgres \
postgres:15.3

docker exec -it -u root postgres /bin/bash

docker container restart postgres
  • Account
    • postgres/postgres

2. Pgsql备份还原

一、Windows下备份和恢复

  1. 备份命令
pg_dump -h localhost -U postgres test > D:\postgres.bak

1. pg_dump 是备份数据库指令;
2. localhost 是数据库的 ip 地址;
3. postgres 是数据库的用户名;
4. test 是数据库名;
5. > 意思是导出到指定目录;
  1. 恢复命令
psql -h localhost -U postgres -d test < D:\postgres.bak

1. psql 是恢复数据库指令;
2. localhost 是要恢复的数据库的 ip 地址;
3. postgres 是数据库的用户名;
4. test 是数据库名;
5. < 意思是导出到指定目录;

二、Linux 下备份和恢复

  1. 备份
pg_dump -h localhost -U postgres -O -x -c --inserts --if-exists --quote-all-identifiers -d databasename > databasename.bak

pg_dump -h localhost -U postgres -O -x -c --inserts --if-exists --quote-all-identifiers -d databasename -t tablename -f /usr/local/posgtes/postgres.sql

  1. 恢复
psql -h localhost -U postgres -d databasename < databasename.bak

psql -h localhost -U postgres -d databasename -f /usr/local/posgtes/postgres.sql

root@pgsql# pg_dump --help
pg_dump dumps a database as a text file or to other formats.

Usage:
pg_dump [OPTION]... [DBNAME]

General options:
-f, --file=FILENAME output file or directory name
-F, --format=c|d|t|p output file format (custom, directory, tar,
plain text (default))
-j, --jobs=NUM use this many parallel jobs to dump
-v, --verbose verbose mode
-V, --version output version information, then exit
-Z, --compress=0-9 compression level for compressed formats
--lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock
--no-sync do not wait for changes to be written safely to disk
-?, --help show this help, then exit

Options controlling the output content:
-a, --data-only dump only the data, not the schema
-b, --blobs include large objects in dump
-B, --no-blobs exclude large objects in dump
-c, --clean clean (drop) database objects before recreating // 重建前先删除
-C, --create include commands to create database in dump
-e, --extension=PATTERN dump the specified extension(s) only
-E, --encoding=ENCODING dump the data in encoding ENCODING
-n, --schema=PATTERN dump the specified schema(s) only
-N, --exclude-schema=PATTERN do NOT dump the specified schema(s)
-O, --no-owner skip restoration of object ownership in // 跳过权限校验
plain-text format
-s, --schema-only dump only the schema, no data
-S, --superuser=NAME superuser user name to use in plain-text format
-t, --table=PATTERN dump the specified table(s) only
-T, --exclude-table=PATTERN do NOT dump the specified table(s)
-x, --no-privileges do not dump privileges (grant/revoke) // 不dump权限信息
--binary-upgrade for use by upgrade utilities only
--column-inserts dump data as INSERT commands with column names
--disable-dollar-quoting disable dollar quoting, use SQL standard quoting
--disable-triggers disable triggers during data-only restore
--enable-row-security enable row security (dump only content user has
access to)
--exclude-table-data=PATTERN do NOT dump data for the specified table(s)
--extra-float-digits=NUM override default setting for extra_float_digits
--if-exists use IF EXISTS when dropping objects // 删除表前添加IF EXISTS校验
--include-foreign-data=PATTERN
include data of foreign tables on foreign
servers matching PATTERN
--inserts dump data as INSERT commands, rather than COPY // 以Insert语句的形式dump
--load-via-partition-root load partitions via the root table
--no-comments do not dump comments
--no-publications do not dump publications
--no-security-labels do not dump security label assignments
--no-subscriptions do not dump subscriptions
--no-table-access-method do not dump table access methods
--no-tablespaces do not dump tablespace assignments
--no-toast-compression do not dump TOAST compression methods
--no-unlogged-table-data do not dump unlogged table data
--on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands
--quote-all-identifiers quote all identifiers, even if not key words // 将表名 字段名用引号包裹
--rows-per-insert=NROWS number of rows per INSERT; implies --inserts
--section=SECTION dump named section (pre-data, data, or post-data)
--serializable-deferrable wait until the dump can run without anomalies
--snapshot=SNAPSHOT use given snapshot for the dump
--strict-names require table and/or schema include patterns to
match at least one entity each
--use-set-session-authorization
use SET SESSION AUTHORIZATION commands instead of
ALTER OWNER commands to set ownership

Connection options:
-d, --dbname=DBNAME database to dump
-h, --host=HOSTNAME database server host or socket directory
-p, --port=PORT database server port number
-U, --username=NAME connect as specified database user
-w, --no-password never prompt for password
-W, --password force password prompt (should happen automatically)
--role=ROLENAME do SET ROLE before dump

If no database name is supplied, then the PGDATABASE environment
variable value is used.

Report bugs to <pgsql-bugs@lists.postgresql.org>.
PostgreSQL home page: <https://www.postgresql.org/>

SQL方式备份和恢复

这里我们用到的工具是 pg_dumppg_dumpall 这种方式可以在数据库正在使用的时候进行完整一致的备份,并不阻塞其它用户对数据库的访问。 它会产生一个脚本文件,里面包含备份开始时,已创建的各种数据库对象的 SQL 语句和每个表中的数据。 可以使用数据库提供的工具 pg_dumpallpg_dump 来进行备份。 pg_dump 只备份数据库集群中的某个数据库的数据,它不会导出角色和表空间相关的信息,因为这些信息是整个数据库集群共用的,不属于某个单独的数据库。 pg_dumpall,对集簇中的每个数据库调用 pg_dump 来完成该工作,还会还转储对所有数据库公用的全局对象( pg_dump 不保存这些对象)。 目前这包括适数据库用户和组、表空间以及适合所有数据库的访问权限等属性。

例如,在我的计算机上,可使用如下命令对名为 dbname 的数据库进行备份:

pg_dump –h 127.0.0.1 -p 5432 -U postgres -c -C –f dbname.sql dbname

使用如下命令可对全部 pg 数据库进行备份:

pg_dumpall –h 127.0.0.1 –p 5432 -U postgres –c -C –f db_bak.sql

恢复方式很简单。执行恢复命令即可:

psql –h 127.0.0.1 -p 5432 -U postgres –f db_bak.sql

3. 常用命令

  1. 命令行操作
# 登录数据库
psql --help
psql -h localhost -p 5432 -U postgres -W -d postgres
psql --host=localhost --port=5432 --username=postgres --password --dbname=postgres

# 创建用户并授权
CREATE USER light WITH PASSWORD 'light';
GRANT ALL PRIVILEGES ON DATABASE test TO light;
ALTER TABLE test.test_table OWNER TO light;
  1. 连接管理
-- 查询当前连接数
SELECT * FROM pg_stat_activity;

-- 查看过期连接
SELECT * FROM pg_stat_activity WHERE state = 'idle';

--删除连接,括号里传pid
SELECT pg_terminate_backend(151);

-- 查看最大连接数
SHOW max_connections;

-- 修改最大连接数,需要superuser权限
ALTER system SET max_connections = 1000;
  1. 数据库操作
-- 查看数据库列表
SELECT datname FROM pg_database;

-- 查看数据表列表
SELECT tablename FROM pg_tables WHERE schemaname='public';

-- 切换到某个数据库
\c db_name;

-- 执行数据库脚本
\i /path/to/scripts.sql

-- 查询当前数据库下的所有数据表
SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' AND table_type = 'BASE TABLE';

-- 删除数据库
DROP DATABASE IF EXISTS "db_name";

-- 创建数据库
CREATE DATABASE "db_name"
WITH OWNER = postgres
TEMPLATE = template0
ENCODING = 'UTF8'
TABLESPACE = pg_default
CONNECTION LIMIT = -1;
GRANT ALL ON DATABASE "db_name" TO postgres;