pgquarrel是一个PostgreSQL数据库的数据库结构(DDL)比对工具。它会对比两个数据库源,并输出一个表示DDL差异的文件。 如果将输出文件运行到目标数据库中,它将具有与源数据库相同的结构。 主要使用场景是将数据库更改部署到测试或生产环境。
pgquarrel不依赖于另一个工具(如pg_dump),而是直接连接到 PostgreSQL 服务器,从目录中获取元数据,比较对象并输出将目标数据库转换为源数据库所需的命令。它拥有过滤器选项:所以,可以比较部分对象。
它可以适用于不同的PostgreSQL版本。如果源PostgreSQL 版本大于目标PostgreSQL版本,生成的文件无法按预期工作。这是因为该工具会生成以前 PostgreSQL 版本中不存在的命令,在低版本中却不能应用。 适用于不同的操作系统。
pgquarrel源码包可以在GitHub下载:https://github.com/eulerto/pgquarrel.git
下边是我在Linux环境进行的测试,数据库版本为源端172.20.10.7(主机名sandata02):PostgreSQL 10.14,目标端172.20.10.8(主机名t1ysl)PostgreSQL 11.5。
1.源库下载git和编译所需的cmake
[root@sandata02 tmp]# yum install -y git cmake
2.源库下载源码包
[pg10@sandata02 ~]$ cd /tmp/
[pg10@sandata02 tmp]$ git clone https://github.com/eulerto/pgquarrel.git
3.编译安装
[pg10@sandata02 ~]$ cd /tmp/pgquarrel/
[pg10@sandata02 pgquarrel]$ cmake -DCMAKE_INSTALL_PREFIX=/tmp/pgquarrel -DCMAKE_PREFIX_PATH=/home/pgquarrel
-- The C compiler identification is GNU 4.8.5
-- Check for working C compiler: /bin/cc
-- Check for working C compiler: /bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
COVERAGE: no
pg_config: /home/pg10/soft/bin/pg_config
PostgreSQL FOUND:
LIBS: /home/pg10/soft/lib/libpgport.a;/home/pg10/soft/lib/libpgcommon.a
PostgreSQL LIBRARIES: /home/pg10/soft/lib/libpq.so
PostgreSQL LIBRARY DIRS: /home/pg10/soft/lib
PostgreSQL INCLUDE DIRS: /home/pg10/soft/include/postgresql/server;/home/pg10/soft/include
-- Configuring done
-- Generating done
-- Build files have been written to: /tmp/pgquarrel
[pg10@sandata02 pgquarrel]$ make
Scanning dependencies of target mini
[ 2%] Building C object mini/CMakeFiles/mini.dir/mini-file.c.o
[ 5%] Building C object mini/CMakeFiles/mini.dir/mini-parser.c.o
[ 8%] Building C object mini/CMakeFiles/mini.dir/mini-readline.c.o
[ 11%] Building C object mini/CMakeFiles/mini.dir/mini-strip.c.o
Linking C shared library libmini.so
[ 11%] Built target mini
Scanning dependencies of target pgquarrel
[ 13%] Building C object CMakeFiles/pgquarrel.dir/src/am.c.o
[ 16%] Building C object CMakeFiles/pgquarrel.dir/src/aggregate.c.o
[ 19%] Building C object CMakeFiles/pgquarrel.dir/src/cast.c.o
[ 22%] Building C object CMakeFiles/pgquarrel.dir/src/collation.c.o
[ 25%] Building C object CMakeFiles/pgquarrel.dir/src/common.c.o
[ 27%] Building C object CMakeFiles/pgquarrel.dir/src/conversion.c.o
[ 30%] Building C object CMakeFiles/pgquarrel.dir/src/domain.c.o
[ 33%] Building C object CMakeFiles/pgquarrel.dir/src/eventtrigger.c.o
[ 36%] Building C object CMakeFiles/pgquarrel.dir/src/extension.c.o
[ 38%] Building C object CMakeFiles/pgquarrel.dir/src/fdw.c.o
[ 41%] Building C object CMakeFiles/pgquarrel.dir/src/function.c.o
[ 44%] Building C object CMakeFiles/pgquarrel.dir/src/index.c.o
[ 47%] Building C object CMakeFiles/pgquarrel.dir/src/language.c.o
[ 50%] Building C object CMakeFiles/pgquarrel.dir/src/matview.c.o
[ 52%] Building C object CMakeFiles/pgquarrel.dir/src/operator.c.o
[ 55%] Building C object CMakeFiles/pgquarrel.dir/src/policy.c.o
[ 58%] Building C object CMakeFiles/pgquarrel.dir/src/publication.c.o
[ 61%] Building C object CMakeFiles/pgquarrel.dir/src/privileges.c.o
[ 63%] Building C object CMakeFiles/pgquarrel.dir/src/quarrel.c.o
[ 66%] Building C object CMakeFiles/pgquarrel.dir/src/rule.c.o
[ 69%] Building C object CMakeFiles/pgquarrel.dir/src/schema.c.o
[ 72%] Building C object CMakeFiles/pgquarrel.dir/src/sequence.c.o
[ 75%] Building C object CMakeFiles/pgquarrel.dir/src/server.c.o
[ 77%] Building C object CMakeFiles/pgquarrel.dir/src/statistics.c.o
[ 80%] Building C object CMakeFiles/pgquarrel.dir/src/subscription.c.o
[ 83%] Building C object CMakeFiles/pgquarrel.dir/src/table.c.o
[ 86%] Building C object CMakeFiles/pgquarrel.dir/src/textsearch.c.o
[ 88%] Building C object CMakeFiles/pgquarrel.dir/src/transform.c.o
[ 91%] Building C object CMakeFiles/pgquarrel.dir/src/trigger.c.o
[ 94%] Building C object CMakeFiles/pgquarrel.dir/src/type.c.o
[ 97%] Building C object CMakeFiles/pgquarrel.dir/src/usermapping.c.o
[100%] Building C object CMakeFiles/pgquarrel.dir/src/view.c.o
Linking C executable pgquarrel
[100%] Built target pgquarrel
[pg10@sandata02 pgquarrel]$ make install
[ 11%] Built target mini
[100%] Built target pgquarrel
Install the project...
-- Install configuration: ""
-- Installing: /tmp/pgquarrel/bin/pgquarrel
-- Set runtime path of "/tmp/pgquarrel/bin/pgquarrel" to "/tmp/pgquarrel/lib"
-- Installing: /tmp/pgquarrel/lib/libmini.so
安装成功后查看工具可添加的选项
[pg10@sandata02 pgquarrel]$ ./pgquarrel --help
pgquarrel shows changes between database schemas.
Usage:
pgquarrel [OPTION]...
Options:
-c, --config=FILENAME configuration file
-f, --file=FILENAME receive changes into this file, - for stdout (default: stdout)
--ignore-version ignore version check
-s, --summary print a summary of changes
-t, --single-transaction execute as a single transaction
--temp-directory=DIR use as temporary file area (default: "/tmp")
-v, --verbose verbose mode
Object options:
--access-method=BOOL access method (default: false)
--aggregate=BOOL aggregate (default: false)
--cast=BOOL cast (default: false)
--collation=BOOL collation (default: false)
--comment=BOOL comment (default: false)
--conversion=BOOL conversion (default: false)
--domain=BOOL domain (default: true)
--event-trigger=BOOL event trigger (default: false)
--extension=BOOL extension (default: false)
--fdw=BOOL foreign data wrapper (default: false)
--foreign-table=BOOL foreign table (default: false)
--function=BOOL function (default: true)
--index=BOOL index (default: true)
--language=BOOL language (default: false)
--materialized-view=BOOL materialized view (default: true)
--operator=BOOL operator (default: false)
--owner=BOOL owner (default: false)
--policy=BOOL policy (default: false)
--publication=BOOL publication (default: false)
--privileges=BOOL privileges (default: false)
--procedure=BOOL procedure (default: true)
--rule=BOOL rule (default: false)
--schema=BOOL schema (default: true)
--security-labels=BOOL security labels (default: false)
--sequence=BOOL sequence (default: true)
--statistics=BOOL statistics (default: false)
--subscription=BOOL subscription (default: false)
--table=BOOL table (default: true)
--text-search=BOOL text search (default: false)
--transform=BOOL transform (default: false)
--trigger=BOOL trigger (default: true)
--type=BOOL type (default: true)
--view=BOOL view (default: true)
Filter options:
--include-schema=PATTERN include schemas that match PATTERN (default: all schemas)
--exclude-schema=PATTERN exclude schemas that match PATTERN (default: none)
Source options:
--source-dbname=DBNAME database name or connection string
--source-host=HOSTNAME server host or socket directory
--source-port=PORT server port
--source-username=NAME user name
--source-no-password never prompt for password
Target options:
--target-dbname=DBNAME database name or connection string
--target-host=HOSTNAME server host or socket directory
--target-port=PORT server port
--target-username=NAME user name
--target-no-password never prompt for password
--help show this help, then exit
--version output version information, then exit
4.查看数据库原本具有的一些对象
[pg10@sandata02 ~]$ psql -d postgres
psql (10.14)
Type "help" for help.
postgres=# \dt
List of relations
Schema | Name | Type | Owner
--------+-----------+-------+----------
public | passwd | table | postgres
public | test_user | table | postgres
(2 rows)
postgres=# \dn
List of schemas
Name | Owner
--------+----------
public | pg10
repmgr | postgres
(2 rows)
postgres=# \di
List of relations
Schema | Name | Type | Owner | Table
--------+----------------------+-------+----------+--------
public | passwd_pkey | index | postgres | passwd
public | passwd_user_name_key | index | postgres | passwd
(2 rows)
[postgres@t1ysl pgquarrel]$ psql -d postgres
psql (11.5)
Type "help" for help.
postgres=# \dt
List of relations
Schema | Name | Type | Owner
--------+------+-------+----------
public | qq | table | postgres
(1 row)
postgres=# \dn
List of schemas
Name | Owner
--------+----------
public | postgres
(1 row)
postgres=# \di
Did not find any relations.
5.使用工具生成对比文件
[pg10@sandata02 pgquarrel]$ ./pgquarrel --file=DDL_diff.txt --ignore-version --source-dbname=postgres --source-host=172.20.10.7 --source-port=5432 --source-username=postgres --target-dbname=postgres --target-host=172.20.10.8 --target-port=5666 --target-username=postgres
6.查看生成的对比文件
[pg10@sandata02 pgquarrel]$ cat DDL_diff.txt
-- pgquarrel 0.7.0
-- quarrel between 10.14 and 11.5
CREATE TABLE public.qq (
age integer,
name character(10)
DROP SCHEMA repmgr;
DROP SEQUENCE public.test_user_id_seq;
DROP TABLE public.passwd;
DROP TABLE public.test_user;
DROP TABLE repmgr.events;
DROP TABLE repmgr.monitoring_history;
DROP TABLE repmgr.nodes;
DROP TABLE repmgr.voting_term;
DROP INDEX public.passwd_user_name_key;
DROP INDEX repmgr.idx_monitoring_history_time;
DROP INDEX repmgr.voting_term_restrict;
> 缺点:pgquarrel不支持所有 Postgresql 对象
具体可去 https://github.com/eulerto/pgquarrel查看
pgquarrel是一个PostgreSQL数据库的数据库结构(DDL)比对工具。它会对比两个数据库源,并输出一个表示DDL差异的文件。 如果将输出文件运行到目标数据库中,它将具有与源数据库相同的结构。 主要使用场景是将数据库更改部署到测试或生产环境。pgquarrel不依赖于另一个工具(如pg_dump),而是直接连接到 PostgreSQL 服务器,从目录中获取元数据,比较对象并输出将目标数据库转换为源数据库所需的命令。它拥有过滤器选项:所以,可以比较部分对象。它可以适用于不同的PostgreS
作者:阎书利
pgquarrel是一个PostgreSQL数据库的数据库结构(DDL)比对工具。它会对比两个数据库源,并输出一个表示DDL差异的文件。 如果将输出文件运行到目标数据库中,它将具有与源数据库相同的结构。 主要使用场景是将数据库更改部署到测试或生产环境。
pgquarrel不依赖于另一个工具(如pg_dump),而是直接连接到 PostgreSQL 服务器,从目录中获取元数据,比较对象并输出将目标数据库转换为源数据库所需的命令。它拥有过滤器选项:所以,可以比较部分对象。
它可以适用于不同的Pos
随着PostgreSQL数据库越来越被广泛的应用,它的优势也逐渐被广泛的认可。但针对该数据库的工具却较少。由于工作需要,经常有对PostgreSQL数据库进行比对生成升级脚本的需求,故本人使用python编写了一个PostgreSQL数据库比对程序和大家共同交流学习。(文章的最后将提供源程序的下载地址)
一、功能介绍
比对程序实现了对两个数据库的结构进行比较并生成差异化更新脚本。
比对的内容如下:
1、表结构比比
pgdiff-PostgreSQL模式差异
pgdiff比较两个PostgreSQL 9数据库之间的模式,并生成alter语句以针对第二个数据库手动运行以使其匹配。 提供的pgdiff.sh脚本有助于自动化该过程。
pgdiff的工作是透明的,因此它永远不会直接修改数据库。 在对数据库运行生成SQL之前,您自己一个人负责验证生成SQL。 继续,看看生成了什么SQL。
pgdiff被编写为易于扩展和提高diff的准确性。
下载1.0 beta 1
pgdiff [options] <schemaType>
(下面列出了选项和<schemaType>)
运行不同的架构类型似乎是一
数据库数据对比工具:可以针对两个数据进行表结构和数据的对比。1、结构对比:如开发库和正式库之间的结构和数据同步,此工具可以告诉您哪个表结构有字段的增加减少,或者字段类型的改变,并生成sql进行结构的同步。2、数据对比:如对比两个数据库中的某个表的数据差异,有差异的行会用颜色进行标记,可生成sql脚本进行两个库的同步。
支持的数据库:MS SQL Server、PosgresSql、MySQL、 MariaDB
要连接PostgreSQL数据库,需要使用以下步骤:
1. 安装PostgreSQL数据库:在Linux系统上,可以使用包管理器安装PostgreSQL。例如,在Ubuntu上,可以使用以下命令安装:
sudo apt-get install postgresql
2. 创建数据库用户:在PostgreSQL中,需要创建一个用户来连接数据库。可以使用以下命令创建一个名为“myuser”的用户:
sudo -u postgres createuser myuser
3. 创建数据库:使用以下命令创建一个名为“mydb”的数据库:
sudo -u postgres createdb mydb
4. 连接数据库:使用以下命令连接到PostgreSQL数据库:
psql -U myuser -d mydb
在这个命令中,“-U”选项指定要使用的用户名,“-d”选项指定要连接的数据库名称。
5. 输入密码:如果设置了密码,则需要输入密码才能连接到数据库。
6. 执行SQL命令:连接到数据库后,可以执行SQL命令来操作数据库。例如,可以使用以下命令创建一个名为“mytable”的表:
CREATE TABLE mytable (
id SERIAL PRIMARY KEY,
name VARCHAR(50) NOT NULL
这些是连接到PostgreSQL数据库的基本步骤。
### 回答2:
Linux是一款开源的操作系统,而PostgreSQL是一款开源的关系型数据库系统。Linux连接PostgreSQL数据库是一项必要的技能,因为它能够使我们在Linux系统上访问和管理PostgreSQL数据库。
在Linux中连接PostgreSQL数据库之前,需要确保已经安装了PostgreSQL数据库服务器,并且数据库服务器正在运行。在Linux中可以使用以下命令检查数据库服务器是否正在运行:
systemctl status postgresql
如果PostgreSQL数据库服务器正在运行,系统将返回类似于以下内容的输出:
postgresql.service - PostgreSQL database server
Loaded: loaded (/usr/lib/systemd/system/postgresql.service; disabled)
Active: active (running) since Fri 2021-08-27 14:57:41 IST; 2h 34min ago
接下来,需要安装PostgreSQL客户端来连接数据库。在Linux中,可以使用以下命令安装PostgreSQL客户端:
sudo apt-get install postgresql-client
在安装完成后,可以使用以下命令连接PostgreSQL数据库:
psql -h [hostname] -p [port] -U [username] -d [database]
其中,[hostname]是PostgreSQL服务器的主机名或IP地址,[port]是PostgreSQL服务器的端口号,默认为5432,[username]是在PostgreSQL服务器上创建的用户名,[database]是要连接的数据库的名称。
例如,假设PostgreSQL服务器的主机名为localhost,端口号为5432,用户名为postgres,数据库名称为mydb,则可以使用以下命令连接到PostgreSQL数据库:
psql -h localhost -p 5432 -U postgres -d mydb
连接成功后,可以使用SQL命令来管理数据库。例如,可以使用以下命令显示当前数据库中的所有表:
总之,在Linux中连接PostgreSQL数据库需要先确保PostgreSQL服务器正在运行,然后安装PostgreSQL客户端并使用psql命令连接数据库。一旦连接成功,便可以使用SQL语句来管理数据库。
### 回答3:
在Linux下连接PostgreSQL数据库,需要进行以下几个步骤:
1. 安装PostgreSQL数据库
首先需要在Linux系统上安装PostgreSQL数据库。可以通过包管理器直接下载安装,也可以在官网下载源码进行编译安装。
2. 启动PostgreSQL服务
安装完成后,在终端输入命令启动PostgreSQL服务:sudo systemctl start postgresql
3. 创建数据库和用户
可以通过命令行工具psql创建数据库和用户。具体命令如下:
a. 创建数据库:sudo -u postgres createdb databasename
b. 创建用户:sudo -u postgres createuser username
4. 设置用户权限和密码
在创建了用户后,需要为其设置权限和密码,可以使用如下两个命令:
a. 给用户授权:sudo -u postgres psql -c "grant all privileges on database databasename to username;"
b. 设置用户密码:sudo -u postgres psql -c "alter user username password 'password';"
5. 安装PostgreSQL客户端
可以使用命令行工具psql连接PostgreSQL数据库,也可以安装pgAdmin等图形化工具。在终端输入如下命令安装psql:sudo apt-get install postgresql-client
6. 连接PostgreSQL数据库并操作
可以通过以下命令连接到PostgreSQL数据库:
psql -h hostname -p port -U username -d databasename
其中,hostname是数据库所在的主机地址,port是数据库服务的端口号,username和databasename是之前创建的用户和数据库名称。
连接上数据库后,即可以执行SQL语句进行增删改查等数据操作。
以上就是Linux连接PostgreSQL数据库的基本流程,根据具体情况可能会有所调整。需要注意的是,在进行任何数据操作时,务必小心谨慎,以免意外删除或修改重要数据。