表结构对比版本

​ 游戏研发中常遇到跨版本执行数据库脚本的事情。一般都是采用按版本号依次准备脚本的方式。更新时依次执行所跨版本的脚本语句。如何其中出现遗落也不好确定。所以一直琢磨是否可以把数据库的表结构输出成文本。然后使用Beyond Compare 对比工具。这样改变的表结构一目了然。也可以用于确定没遗落更新。安全性大大提高。

Shell脚本:CheckDbTableData.sh

#!/bin/bash
#sh /data/sqldata/CheckDbTableData/CheckDbTableData.sh >> /data/sqldata/CheckDbTableData/check_table_data.log
echo "CheckDbTableData Begin"
cd /data/sqldata/CheckDbTableData
mysql -uroot -pyuia1981 -h 10.33.10.6 -P 3306 -Dfinal_login_db0 <CheckDbTableData.sql

echo "CheckDbTableData End"

导出表结构脚本:CheckDbTableData.sql

SET CHARACTER_SET_CLIENT=utf8;
SET CHARACTER_SET_CONNECTION=utf8;

DELIMITER $$

DROP PROCEDURE IF EXISTS `CheckDbTableDataSql`$$

CREATE PROCEDURE `CheckDbTableDataSql`()
BEGIN
    DECLARE i INT DEFAULT 0;
    DECLARE tempCount INT DEFAULT 0;

    DECLARE dbSql VARCHAR(512) DEFAULT '';
    DECLARE dbNameSql VARCHAR(512) DEFAULT '';
    DECLARE checkDbSql VARCHAR(512) DEFAULT '';

    DECLARE tableName VARCHAR(128) DEFAULT '';
    DECLARE checkSrceSql VARCHAR(1024) DEFAULT '';
    DECLARE runSrceSql VARCHAR(1024) DEFAULT '';
    DECLARE calTableSql VARCHAR(1024) DEFAULT '';

    DECLARE tempAllCount INT DEFAULT 0;
    DECLARE tempTableCount INT DEFAULT 0;

    -- 获取当前数据库
    prepare stmt from "SELECT database() INTO @dbSql";
    EXECUTE stmt;
    SELECT @dbSql;

    -- 循环导入数据
    SET @checkSql=CONCAT("SELECT COUNT(1) into @tempCount FROM information_schema.TABLES WHERE TABLE_SCHEMA = '",@dbSql,"'");
    prepare stmt from @checkSql;
    EXECUTE stmt;

    SET @checkSrceSql=CONCAT("SELECT table_name into @tableName FROM information_schema.TABLES WHERE TABLE_SCHEMA = '",@dbSql,"' ORDER BY lower(table_name) LIMIT [##],1");
    WHILE i < @tempCount DO
        SET @runSrceSql=REPLACE(@checkSrceSql,'[##]',i);
        prepare stmt from @runSrceSql;
        EXECUTE stmt;
        SELECT lower(@tableName);

        -- 循环输出表字段信息
        SET @calTableSql=CONCAT("SELECT lower(COLUMN_NAME),COLUMN_TYPE FROM information_schema.COLUMNS where table_name='",@tableName,"' AND TABLE_SCHEMA='",@dbSql,"' ORDER BY lower(COLUMN_NAME)");
        prepare stmt from @calTableSql;
        EXECUTE stmt;

        SET i=i+1;
    END WHILE;
END$$

DELIMITER $$

CALL CheckDbTableDataSql();
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。