繁体   English   中英

如何恢复mysqldump双重编码的数据库

[英]How to restore the database double encoded by mysqldump

我使用 mysqldump 来备份我的数据库。 我的数据库被意外破坏了,现在我想恢复它。 但是 SQL 文件由 bug#28969 双重编码。 http://bugs.mysql.com/bug.php?id=28969 Is there any solution for my data to go back? 我只有mysqldump制作的SQL文件。 谢谢。


我找回了我的数据。 感谢大家。

通过这种方式,

1.导入杂乱的数据

2.使用 sqldump 作为 'mysqldump -h "$DB_HOST -u "$DB_USER" -p"$DB_PASSWORD" --opt --quote-names --skip-set-charset --default-character-set=latin1 "$ DB_NAME" > /tmp/temp.sql'

参考

http://pastebin.com/iSwVPk1w

我找回了我的数据。 感谢大家。

通过这种方式,

1.导入杂乱的数据

2.使用sqldump作为mysqldump -h "$DB_HOST -u "$DB_USER" -p"$DB_PASSWORD" --opt --quote-names --skip-set-charset --default-character-set=latin1 "$DB_NAME" > /tmp/temp.sql

参考

#!/bin/bash -e

DB_HOST="$1"
DB_USER="$2"
DB_PASSWORD="$3"
DB_NAME="$4"


mysqldump -h "$DB_HOST -u "$DB_USER" -p"$DB_PASSWORD" --opt --quote-names \
    --skip-set-charset --default-character-set=latin1 "$DB_NAME" > /tmp/temp.sql

mysql -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASSWORD" \
    --default-character-set=utf8 "$DB_NAME" < /tmp/temp.sql

如果您的数据库包含正确的排序规则,但数据库中的完整数据是双重编码的,那么这将帮助您记住您只执行一次并备份您的数据库。

<?php
/**
 * DoublyEncodeCorrection.php
 *
 * NOTE: Look for 'TODO's for things you may need to configure.
 * PHP Version 5
 *
 */
ini_set('display_errors','1');
//error_reporting(E_ALL ^ E_NOTICE ^ E_DEPRECATED);
// TODO: Pretend-mode -- if set to true, no SQL queries will be executed.  Instead, they will only be echo'd
// to the console.
$pretend = true;

// TODO: Should SET and ENUM columns be processed?
$processEnums = false;

// TODO: The collation you want to convert the overall database to
$defaultCollation = 'utf8_general_ci';

// TODO Convert column collations and table defaults using this mapping
// latin1_swedish_ci is included since that's the MySQL default
$collationMap = array(
    'latin1_bin'        => 'utf8_bin',
    'latin1_general_ci' => 'utf8_general_ci',
    'latin1_swedish_ci' => 'utf8_general_ci'
);

$mapstring = '';
foreach ($collationMap as $s => $t) {
    $mapstring .= "'$s',";
}

$mapstring = substr($mapstring, 0, -1); // Strip trailing comma
//echo $mapstring;

// TODO: Database information
$dbHost = 'localhost';
$dbName = 'tina';
$dbUser = 'root';
$dbPass = 'root';

// Open a connection to the information_schema database
$infoDB = mysql_connect($dbHost, $dbUser, $dbPass);

mysql_select_db('information_schema', $infoDB);

// Open a second connection to the target (to be converted) database
$targetDB = mysql_connect($dbHost, $dbUser, $dbPass, true);
mysql_select_db($dbName, $targetDB);

if (!is_resource($targetDB)) {
    echo "Could not connect to db!: " . mysql_error();exit;
}

if (mysql_select_db($dbName, $targetDB) === FALSE) {
    echo "Could not select database!: " . mysql_error();exit;
}

//
// TODO: FULLTEXT Indexes
//
// You may need to drop FULLTEXT indexes before the conversion -- execute the drop here.
// eg.
//    sqlExec($targetDB, "ALTER TABLE MyTable DROP INDEX `my_index_name`", $pretend);
//
// If so, you should restore the FULLTEXT index after the conversion -- search for 'TODO'
// later in this script.
//

// Get all tables in the specified database
$tables = sqlObjs($infoDB,
    "SELECT TABLE_NAME, TABLE_COLLATION
     FROM   TABLES
     WHERE  TABLE_SCHEMA = '$dbName'");

foreach ($tables as $table) {
    $tableName      = $table->TABLE_NAME;
    $tableCollation = $table->TABLE_COLLATION;

    // Find all columns that aren't of the destination collation
    $cols = sqlObjs($infoDB,
        "SELECT *
         FROM   COLUMNS
         WHERE  TABLE_SCHEMA    = '$dbName'
            AND TABLE_Name      = '$tableName'
            ");

    $intermediateChanges = array();
    $finalChanges = array();

    foreach ($cols as $col) {

        // If this column doesn't use one of the collations we want to handle, skip it
        if (in_array($col->COLLATION_NAME, $collationMap)) {
            //echo "<pre>";print_r($col->COLUMN_NAME);exit;
           sqlExec($targetDB,"UPDATE $dbName.$tableName SET $col->COLUMN_NAME = CONVERT(CAST(CONVERT($col->COLUMN_NAME USING latin1) AS BINARY) USING utf8)") ;
        }
    }
}


/**
 * Executes the specified SQL
 *
 * @param object  $db      Target SQL connection
 * @param string  $sql     SQL to execute
 * @param boolean $pretend Pretend mode -- if set to true, don't execute query
 *
 * @return SQL result
 */
function sqlExec($db, $sql, $pretend = false)
{
    echo "$sql;\n";

    if ($pretend === false) {
        $res = mysql_query($sql, $db);
        //echo "<pre>";print_r($res);exit;
        $error = mysql_error($db);
        if ($error !== '') {
            print "!!! ERROR: $error\n";
        }

        return $res;
    }

    return false;
}

/**
 * Gets the SQL back as objects
 *
 * @param object $db  Target SQL connection
 * @param string $sql SQL to execute
 *
 * @return SQL objects
 */
function sqlObjs($db, $sql)
{
    $res = sqlExec($db, $sql);

    $a = array();

    if ($res !== false) {
        while ($obj = mysql_fetch_object($res)) {
            $a[] = $obj;
        }
    }

    return $a;
}

?> 

如果它只是将 UTF-8 字节加倍或添加一些东西,我建议将一个快速的 sed/awk 命令放在一起来匹配和纠正它们。

http://www.osnews.com/story/21004/Awk_and_Sed_One-Liners_Explained

如果您对此不满意,任何支持正则表达式的脚本语言都可以用来轻松地做同样的事情,尽管这可能需要几分钟。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM