web-dev-qa-db-ja.com

不正なMySQLダンプをインポートするときに行をスキップする方法

不正なmysqldumpを指定すると、インポート時にエラーが発生します。

namtar backups # mysql -p < 2010-12-01.sql
Enter password: 
ERROR 1062 (23000) at line 8020: Duplicate entry 'l�he?' for key 'wrd_txt'

特定の行をスキップして続行するようにインポートに指示する簡単な方法はありますか?

(はい、手動でファイルを編集したり、出力を解析したりできますが、あまり便利ではありません)

35
Almad

ダンプを再度作成できる場合は、ダンプ時にコマンドラインに--insert-ignoreを追加できます。

または、mysqlimportコマンドと--forceを使用して試すことができます。これは、MySQLエラーが発生しても続行します。

46
jmlsteele

mysql -f -p < 2010-12-01.sql

-f(force)はここで有効なオプションであり、私のために働いた。

36

Jmlsteeleの回答とコメントからのアドバイスに従って、挿入をその場でINSERT IGNOREに変換する方法を次に示します。

sqlファイルからインポートする場合:

sed -e "s/^INSERT INTO/INSERT IGNORE INTO/" < 2010-12-01.sql | mysql -p

gzファイルからインポートする場合は、ファイル入力を使用する代わりに、gunzipからの出力をsedにパイプするだけです。

gunzip < 2010-12-01.sql.gz | sed -e "s/^INSERT INTO/INSERT IGNORE INTO/" | mysql -p
22
Ben

他のオプションは確かに実行可能なオプションですが、別の解決策は単に.sqlmysqldumpから取得したファイル。

変化する:

INSERT INTO table_name ...

INSERT IGNORE INTO table_name ...
1
PromInc

ダンプの一番上にあるMySQLディレクティブを削除したのはどうしてですか? (sedコマンドで既に挿入したすべてのレコード/テーブルを削除した後、復元を再開したときに、意図せずに実行しました)。これらのディレクティブは、一意のテスト、外部キーテストなどを行わないように、特にMySQLに指示します)

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
1
zzapper

素晴らしいヒント。私はそれを少し違うが同じ結果にしました。

Perl -pi -e 's/INSERT INTO/INSERT IGNORE INTO/g' filename.sql
0
Robert Saylor