获取MySQL8 .ibd文件 表结构字段

MySQL   2024-10-29 11:05:32   796    

先使用 命令 

ibd2sdi --dump-file user.txt ./user.ibd 
生成json 数据到txt文件,在使用php拼接sql
function getC($data)
{
    $object = $data[1]['object']['dd_object'];
    $tableName = $object['name'] ?? '';
    $columns = $object['columns'] ?? [];

    $sql = "DROP TABLE IF EXISTS `{$tableName}`;" . PHP_EOL;
    $sql .= "CREATE TABLE `{$tableName}` (";
    $columnSql = '';
    $primary = '';
    foreach ($columns as $key => $column) {
        $columnName = $column['name'];
//        if ($columnName === 'DB_TRX_ID'
//            || $columnName === 'DB_ROLL_PTR'
//            || $columnName === 'DB_ROW_ID') {
//            continue;
//        }
        if ($column['hidden'] == 2) {//隐藏字段
            continue;
        }
        $columnType = $column['column_type_utf8'];
        $default = ($column['default_value_utf8'] !== "") ? "DEFAULT {$column['default_value_utf8']}" : '';
        $comment = !empty($column['comment']) ? "COMMENT '{$column['comment']}'" : '';
        $auto_increment = $column['is_auto_increment'] == true ? "AUTO_INCREMENT" : '';
        $isNullable = '';
        if (!$default) {
            $isNullable = $column['is_nullable'] ? 'NULL' : 'NOT NULL';
        }
        if ($column['name'] === 'id') {
            $primary = " PRIMARY KEY (`{$column['name']}`) USING BTREE,";
        }
        $columnSql .= (PHP_EOL . "`$columnName` $columnType $isNullable $default $auto_increment $comment, ");
    }

    if ($columnSql) {
//        $row_format = $object['row_format'] ;
        if ($primary) {
            $columnSql .= PHP_EOL . $primary;
        }
        $sql .= PHP_EOL . rtrim($columnSql, ", ") . PHP_EOL;
        $sql .= ") ENGINE = {$object['engine']} AUTO_INCREMENT=1 COMMENT='{$object['comment']}' ROW_FORMAT = Dynamic; ";
        return $sql . PHP_EOL . PHP_EOL . PHP_EOL;
    }
    return '';
}
$json = file_get_contents('user.txt');
$sql = getC(json_decode($json, true));
file_put_contents('user.sql', $sql, FILE_APPEND);