Thread: A compare and/or sync. database structure?
Hi!
I wanna ask that which pg_dump command line needed if I want to compare two databases?
I have many DBs, but all of them have two versions a development (local) DB and the online (web) DB.
When I want to realize a new function, I develop it locally, and later I sync. it into online DB.
But it is hard: I easily miss some things... :-(
Because of that I want to write some tool that can compare databases.
In DBISAM world I can do it easily, because DBISAM tables very-very near to Delphi DataSets, and I can compare tables/indexes with Delphi comparations.
In Firebird it was harder, because if must compare tables, and later other objects (generators) too... :-(
In PostgreSQL I have two way to compare DBs.
1.) pg_dumps, and textdiff.
2.) get schema (table struct, indexes, etc) from all, and compare them.
The first version is need user SQLs, the second can create alter/create SQLs automatically...
So please help me with your experience: what is the best solution, what is the possible problem that make mistakes with this plan, and how to realize it easily?
Thanks for your help:
dd
--
Using Opera's revolutionary e-mail client: http://www.opera.com/mail/
Le mercredi 5 août 2009 à 10:13:44, durumdara@gmail.com a écrit : > [...] > So please help me with your experience: what is the best solution, what is > the possible problem that make mistakes with this plan, and how to realize > it easily? > You can try check_postgres.pl Perl script. The same_schema action seems to be what you need. Here is a little example: guillaume@laptop:~$ createdb db1 guillaume@laptop:~$ psql -c "CREATE TABLE t1(id integer);" db1 CREATE TABLE guillaume@laptop:~$ psql -c "CREATE TABLE t2(id integer, c text);" db1 CREATE TABLE guillaume@laptop:~$ createdb db2 guillaume@laptop:~$ psql -c "CREATE TABLE t1(id integer);" db2 CREATE TABLE So, db1 with two tables and db2 with one only. guillaume@laptop:~$ LANG=C check_postgres.pl --action same_schema --dbname db1 --dbname2 db2 POSTGRES_SAME_SCHEMA CRITICAL: DB "db1 => db2" Databases were different. Items not matched: 1 | time=0.01 Table in 1 but not 2: public.t2 It works. Now I add the missing table: guillaume@laptop:~$ psql -c "CREATE TABLE t2(id integer, c text);" db2 CREATE TABLE guillaume@laptop:~$ LANG=C check_postgres.pl --action same_schema --dbname db1 --dbname2 db2 POSTGRES_SAME_SCHEMA OK: DB "db1 => db2" Both databases have identical items | time=0.01 Works too. Works great actually :) It works also with the other objects of the database. Regards. -- Guillaume. http://www.postgresqlfr.org http://dalibo.com
Hi! Thanks... Sorry, but this is not good solution for me, because of the webserver is not opened (port) to the net, and I must compare local, a web dbs. So I try to find a solution, that can create a "map" from structure in XML, text, etc., and I can get it with ftp and compare it... First I search for a simple tool that can compare dbs in textual way... dd On Wed, 05 Aug 2009 10:49:53 +0200, Guillaume Lelarge <guillaume@lelarge.info> wrote: > Le mercredi 5 août 2009 à 10:13:44, durumdara@gmail.com a écrit : >> [...] >> So please help me with your experience: what is the best solution, what >> is >> the possible problem that make mistakes with this plan, and how to >> realize >> it easily? >> > > You can try check_postgres.pl Perl script. The same_schema action seems > to be > what you need. > > Here is a little example: > > guillaume@laptop:~$ createdb db1 > guillaume@laptop:~$ psql -c "CREATE TABLE t1(id integer);" db1 > CREATE TABLE > guillaume@laptop:~$ psql -c "CREATE TABLE t2(id integer, c text);" db1 > CREATE TABLE > guillaume@laptop:~$ createdb db2 > guillaume@laptop:~$ psql -c "CREATE TABLE t1(id integer);" db2 > CREATE TABLE > > So, db1 with two tables and db2 with one only. > > guillaume@laptop:~$ LANG=C check_postgres.pl --action same_schema > --dbname db1 > --dbname2 db2 > POSTGRES_SAME_SCHEMA CRITICAL: DB "db1 => db2" Databases were different. > Items > not matched: 1 | time=0.01 Table in 1 but not 2: public.t2 > > It works. Now I add the missing table: > > guillaume@laptop:~$ psql -c "CREATE TABLE t2(id integer, c text);" db2 > CREATE TABLE > guillaume@laptop:~$ LANG=C check_postgres.pl --action same_schema > --dbname db1 > --dbname2 db2 > POSTGRES_SAME_SCHEMA OK: DB "db1 => db2" Both databases have identical > items | > time=0.01 > > Works too. Works great actually :) > > It works also with the other objects of the database. > > Regards. > > -- Using Opera's revolutionary e-mail client: http://www.opera.com/mail/
The free, open-source SchemaCrawler for SQL Server tool is desinged to do just this. You can take human-readable snapshots of the schema and data, for later comparison. Comparisons are done using a standard diff tool such as WinMerge. SchemaCrawler outputs details of your schema (tables, views, procedures, and more) in a diff-able plain-text format (text, CSV, or XHTML). SchemaCrawler can also output data (including CLOBs and BLOBs) in the same plain-text formats. SchemaCrawler is available at SourceForge: http://schemacrawler.sourceforge.net/ Sualeh Fatehi