2010-11-28 37 views
2

私は古いマシンのdrupalサイト用の大きなMySQL 5データベースを持っています。バックアップと新鮮なデータベースにリストアした後、私が得た:行MySQLの整合性をチェックするには?

ERROR 1064(42000)* *:あなたのSQL構文でエラーが発生している 。 が '' captcha_success_form_ids近くで使用する 権利構文についてはMySQLサーバのバージョンを に対応マニュアルを確認してください|:1:{S:13: "user_registerの\" \; sの:13: "user_registerの\" \; } sp ' at line 1

私はどのテーブルがこのエラーの起源であるかわかりません(「user_register」というテーブルはありません)。だから私はどのように元のデータベースの完全性のための迅速なチェックをもう一度失敗したバックアップ/復元の作業を行う前にすることができますか? (私はコマンドラインアクセスを持っている)。おかげ

+0

テーブルuser_registerではなく、挿入しようとしているデータがシリアル化されているようですが、これを挿入してみてください –

+0

どのようにバックアップを生成していますか?たとえば、mysqldump、MySQL Administratorなどを使用していますか? mysqldumpを使って同じエラーが発生するかどうかを調べてみてください。 – cbranch

+0

@ Haim:どうすればエラーを取り除くことができますか? – qliq

答えて

2

エラーメッセージに引用されたフラグメントは、MySQLのように何も見えません - それは私はあなたが適切にあなたのデータをエスケープしていないと思わせるシリアライズされたPHPのデータのように見えますコード。あなたのPHPインストールは変更されていますか?特にスマートクォート? (smartquotesは廃止予定です)。

+0

+1これは私よりも良い答えです。私はそれがエスケープ問題のように見えることに同意します。質問は、DBをインポートするときにエラーが発生しているかどうか(つまり、mysqldumpでのバグ/問題)か、アプリケーションが動作しているとき(PHPコードや設定のバグ/問題)です。 – cbranch

3

あなたは、元のデータベース内の破損の疑いがある場合、あなたは次の操作を行うことができます:私は「

http://www.mysqlperformanceblog.com/2008/07/04/recovering-innodb-table-corruption/

:InnoDBテーブルの場合

CHECK TABLE <table_name>; 
REPAIR TABLE <table_name>; 

:MyISAMテーブルの場合

をCHECKとREPAIRが検出し修正することができた稀な機会にMyISAMテーブルで個人的に腐敗が見られました。私はInnoDBテーブルの破損を経験したことがないので、リンクで提供される情報に関して個人的な経験から話すことはできません。

私はあなたの靴の中にいたとしたら、mysqldumpが出力する出力ファイルを詳しく調べて、エラーの原因を突き止めることができるかどうかを確認します。 mysqldumpは通常、すべてのデータを1行にまとめたテーブルごとに1つのINSERT文を出力するので、エラーメッセージに含まれる行番号があまり役に立たないため、エラーを診断するのは少し難解です。ですから、私はmysqldump出力ファイルを編集し、各行の間に改行を挿入することです。たとえば、次のように

オリジナル:

INSERT INTO table VALUES (a,b,c),(d,e,f),(g,h,i), ... 

への変更:

INSERT INTO table VALUES (a,b,c), 
(d,e,f), 
(g,h,i), 
... 

コマンドラインに慣れているので、あなたはおそらく、SEDなど

でこれを自動化することができ次に、変更されたファイルをインポートしようとします。同じエラーが発生するはずですが、今回は行番号が問題の原因となっている行を正確に特定するのに役立ちます。その時点で、問題を診断できなければなりません(またはmysqldump出力の問題箇所をここに投稿してください)。

EDIT:

はあなたインポートデータベースが起こって引用したエラーメッセージですか?または、データベースは正常にインポートされますが、アプリケーションはデータベースにアクセスするときにエラーメッセージを生成しますか?私は前者を仮定していましたが、あなたの質問を再読した後で後者かもしれないと思っています。

さらに1つのアイデア:データベースに保存されているprocsが含まれていますか?もしそうなら、mysqldumpはデフォルトでそれらを含みません。あなたは--routinesオプションを使用する必要があります。

mysqldump --routines -u <user> -p<password> <database> > output 
関連する問題