【发布时间】:2012-10-01 15:59:50
【问题描述】:
我想对 MySQL 数据库模式(没有数据)进行哈希/签名,以便对其进行校验,以确保它不会被其他人修改。
我怎样才能实现它?
【问题讨论】:
我想对 MySQL 数据库模式(没有数据)进行哈希/签名,以便对其进行校验,以确保它不会被其他人修改。
我怎样才能实现它?
【问题讨论】:
据我了解您的问题,您需要表格校验和:
checksum table `table`
所以,我猜只是做一个空表的校验和
【讨论】:
mysqldump -d database - 这将转储整个数据库,然后创建测试数据库,创建所有表(它们将是空的,因为-d 标志 - --no-data)并进行校验和。是的,我认为没有一种简单的方法可以做你想做的事。
show create table 'table' 的表,并且我将拥有所有表的初始结构以进行比较。这对我来说有点简单,然后进行转储,然后使用checksum检查所有表
mysqldump 包含有关它的版本和 mysql 服务器上的版本的信息。如果您升级/降级 mysql 服务器或 mysql 客户端(这将导致升级/降级 mysqldump),您生成的文件的签名显然会有所不同,尽管架构没有更改。为避免这种情况,请使用mysqldump 的--compact 选项,如下所示:mysqldump --compact -u root --password=root --host=127.0.0.1 test | md5sum。
checksum table 'table' 的 empty 表始终为 0,则无论表结构如何,此答案如何正确? (MySQL 5.5)
SELECT HEX( CRC32 ( SUM( CRC32( CONCAT(
COALESCE(TABLE_NAME,''),
COALESCE(COLUMN_NAME,''),
COALESCE(ORDINAL_POSITION,''),
COALESCE(COLUMN_DEFAULT,''),
COALESCE(IS_NULLABLE,''),
COALESCE(DATA_TYPE,''),
COALESCE(CHARACTER_MAXIMUM_LENGTH,''),
COALESCE(CHARACTER_OCTET_LENGTH,''),
COALESCE(NUMERIC_PRECISION,''),
COALESCE(NUMERIC_SCALE,''),
COALESCE(CHARACTER_SET_NAME,''),
COALESCE(COLLATION_NAME,''),
COALESCE(COLLATION_NAME,''),
COALESCE(COLUMN_TYPE,''),
COALESCE(COLUMN_KEY,'')
) ) ) ) ) AS 'hash'
FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'database_name';
【讨论】: