【问题标题】:Hash MySQL database schema散列 MySQL 数据库架构
【发布时间】:2012-10-01 15:59:50
【问题描述】:

我想对 MySQL 数据库模式(没有数据)进行哈希/签名,以便对其进行校验,以确保它不会被其他人修改。

我怎样才能实现它?

【问题讨论】:

    标签: mysql checksum


    【解决方案1】:

    据我了解您的问题,您需要表格校验和:

    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)
    【解决方案2】:
    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';
    

    【讨论】:

    • 谢谢你的回答,你能解释一下你的答案吗?
    猜你喜欢
    • 1970-01-01
    • 2015-12-23
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-25
    • 2011-05-05
    相关资源
    最近更新 更多