To use mysqldbcompare, you will need to install MySQL Utilities and MySQL Connector/Python. You can find them here:
I use mysqldbcompare to compare the database objects to identify new tables/columns or anything that has been created or dropped. You can also use it to compare data itself, which would be useful to compare a replica or backup database with its source.
The usage is very simple. I created two identical databases in my localhost using the Chinook Database named Chinook and Chinook2.
The mysqldbcompare syntax is very simple. You use --server1 and server2 to specify the hosts of the databases and then the database names between colon, for example Chinook:Chinook2. You also can use --run-all-tests to avoid stopping at the first object different, and continue to process for all db objects.
mysqldbcompare --server1=root:password@localhost:3306 --server2=root:password@localhost:3306 Chinook:Chinook2 --run-all-tests
The output is:
# server1 on localhost: ... connected.
# server2 on localhost: ... connected.
# Checking databases Chinook on server1 and Chinook2 on server2
#
# Object definitions differ. (--changes-for=server1)
#
--- `Chinook`
+++ `Chinook2`
@@ -1 +1 @@
-CREATE DATABASE `Chinook` /*!40100 DEFAULT CHARACTER SET latin1 */
+CREATE DATABASE `Chinook2` /*!40100 DEFAULT CHARACTER SET latin1 */
# Defn Row Data
# Type Object Name Diff Count Check
# -------------------------------------------------------------------------
# TABLE Album pass pass -
# - Compare table checksum FAIL
# - Find row differences pass
# TABLE Artist pass pass -
# - Compare table checksum FAIL
# - Find row differences pass
# TABLE Customer pass pass -
# - Compare table checksum FAIL
# - Find row differences pass
# TABLE Employee pass pass -
# - Compare table checksum FAIL
# - Find row differences pass
# TABLE Genre pass pass -
# - Compare table checksum FAIL
# - Find row differences pass
# TABLE Invoice pass pass -
# - Compare table checksum FAIL
# - Find row differences pass
# TABLE InvoiceLine pass pass -
# - Compare table checksum FAIL
# - Find row differences pass
# TABLE MediaType pass pass -
# - Compare table checksum FAIL
# - Find row differences pass
# TABLE Playlist pass pass -
# - Compare table checksum FAIL
# - Find row differences pass
# TABLE PlaylistTrack pass pass -
# - Compare table checksum FAIL
# - Find row differences pass
# TABLE Track pass pass -
# - Compare table checksum FAIL
# - Find row differences pass
# Databases are consistent.
#
# ...done
Note that object definitions, row count and row content match. It shows that table checksum are different, but my guess is that they are not the exactly replica since I created Chinook2 by running the same sql script again.
You can use the option --skip-data-check if you only want to compare objects definition and not data. After I made some changes in Chinook2 (drop and create table and columns), I run mysqldbcompare with --skip-data-check:
mysqldbcompare --server1=root:password@localhost:3306 --server2=root:password@localhost:3306 Chinook:Chinook2 --run-all-tests --skip-data-check
The output is:
# server1 on localhost: ... connected.
# server2 on localhost: ... connected.
# Checking databases Chinook on server1 and Chinook2 on server2
#
# Object definitions differ. (--changes-for=server1)
#
--- `Chinook`
+++ `Chinook2`
@@ -1 +1 @@
-CREATE DATABASE `Chinook` /*!40100 DEFAULT CHARACTER SET latin1 */
+CREATE DATABASE `Chinook2` /*!40100 DEFAULT CHARACTER SET latin1 */
# WARNING: Objects in server1.Chinook but not in server1.Chinook2:
# TABLE: PlaylistTrack
#
# WARNING: Objects in server1.Chinook2 but not in server1.Chinook:
# TABLE: Address
#
# Defn Row Data
# Type Object Name Diff Count Check
# -------------------------------------------------------------------------
# TABLE Album pass pass SKIP
# TABLE Artist pass pass SKIP
# TABLE Customer FAIL pass SKIP
#
# Object definitions differ. (--changes-for=server1)
#
--- `Chinook`.`Customer`
+++ `Chinook2`.`Customer`
@@ -3,16 +3,14 @@
`FirstName` varchar(40) CHARACTER SET utf8 NOT NULL,
`LastName` varchar(20) CHARACTER SET utf8 NOT NULL,
`Company` varchar(80) CHARACTER SET utf8 DEFAULT NULL,
- `Address` varchar(70) CHARACTER SET utf8 DEFAULT NULL,
- `City` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
- `State` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
- `Country` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
- `PostalCode` varchar(10) CHARACTER SET utf8 DEFAULT NULL,
`Phone` varchar(24) CHARACTER SET utf8 DEFAULT NULL,
`Fax` varchar(24) CHARACTER SET utf8 DEFAULT NULL,
`Email` varchar(60) CHARACTER SET utf8 NOT NULL,
`SupportRepId` int(11) DEFAULT NULL,
+ `AddressId` int(11) DEFAULT NULL,
PRIMARY KEY (`CustomerId`),
KEY `IFK_CustomerSupportRepId` (`SupportRepId`),
+ KEY `FK_CustomerAddressId` (`AddressId`),
+ CONSTRAINT `FK_CustomerAddressId` FOREIGN KEY (`AddressId`) REFERENCES `Address` (`AddressId`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `FK_CustomerSupportRepId` FOREIGN KEY (`SupportRepId`) REFERENCES `Employee` (`EmployeeId`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=60 DEFAULT CHARSET=latin1
# TABLE Employee FAIL pass SKIP
#
# Object definitions differ. (--changes-for=server1)
#
--- `Chinook`.`Employee`
+++ `Chinook2`.`Employee`
@@ -6,15 +6,13 @@
`ReportsTo` int(11) DEFAULT NULL,
`BirthDate` datetime DEFAULT NULL,
`HireDate` datetime DEFAULT NULL,
- `Address` varchar(70) CHARACTER SET utf8 DEFAULT NULL,
- `City` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
- `State` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
- `Country` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
- `PostalCode` varchar(10) CHARACTER SET utf8 DEFAULT NULL,
`Phone` varchar(24) CHARACTER SET utf8 DEFAULT NULL,
`Fax` varchar(24) CHARACTER SET utf8 DEFAULT NULL,
`Email` varchar(60) CHARACTER SET utf8 DEFAULT NULL,
+ `AddressId` int(11) DEFAULT NULL,
PRIMARY KEY (`EmployeeId`),
KEY `IFK_EmployeeReportsTo` (`ReportsTo`),
+ KEY `FK_EmployeeAddressId` (`AddressId`),
+ CONSTRAINT `FK_EmployeeAddressId` FOREIGN KEY (`AddressId`) REFERENCES `Address` (`AddressId`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `FK_EmployeeReportsTo` FOREIGN KEY (`ReportsTo`) REFERENCES `Employee` (`EmployeeId`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1
# TABLE Genre pass pass SKIP
# TABLE Invoice pass pass SKIP
# TABLE InvoiceLine pass pass SKIP
# TABLE MediaType pass pass SKIP
# TABLE Playlist pass pass SKIP
# TABLE Track pass pass SKIP
# Database consistency check failed.
#
# ...done
As you can see in the diff output above, I dropped the PlaylistTrack table and created the Address table (see # WARNING). I also dropped the address related columns in Employee and Customer tables (see lines starting with -) and added the addressId foreign key (see lines starting with +).
For more information, see:
http://dev.mysql.com/doc/mysql-utilities/1.3/en/mysqldbcompare.html#option_mysqldbcompare_run-all-tests
No comments:
Post a Comment