web-dev-qa-db-ja.com

MySQLバックアップを復元するときのビューの問題

私はいくつかのテーブル、ビュー、ルーチンを含むデータベース(InnoDB)を持っています...

定期的にコマンドラインを使用してバックアップを行います。

mysqldump -u user -ppassword --routines db_name > backup.sql

しかし、私はワークベンチを使用してバックアップを作成することにも問題があります

ところで、バックアッププロセスは問題や警告なしに終了します...

復元後、いくつかの問題が発生し、復元プロセスはエラーなしで正常に終了しますが、一部のビューが破損しています

  • それを変更しようとしたり、構造を表示しようとすると、空/空白の結果が表示されました
  • ビューで選択を実行すると、正しい結果が表示されます(ビューが破損していないなど)...

ビュー自体を変更することはできません。

どうすれば修正できますか?そして、なぜ私はこの問題を抱えているのですか?

MySQL Workbench 5.2.35 CE ...を使用すると、空白/空の結果が表示されます。

プレーンSQLを使用(view_nameを説明)次のエラーが発生しました:

エラーコード:1356。ビュー 'db.view_name'は無効なテーブル、列、関数、またはビューの定義者/呼び出し者がそれらを使用する権限を参照していません

しかし select * from view_nameまだ予期した結果を返します

SHOW CREATE VIEW view_name

エラーコード:1356。ビュー 'view_name'は無効なテーブルまたは列または関数を参照しています>またはビューの定義者/呼び出し者がそれらを使用する権限がありません

SELECT * FROM INFORMATION_SCHEMA.TABLES where table_schema = 'db_name' and table_name = 'view_name'

TABLE_CATALOG   def 
TABLE_SCHEMA    db_name 
TABLE_NAME      view_name 
TABLE_TYPE  VIEW
ENGINE  VERSION NULL
ROW_FORMAT  NULL
TABLE_ROWS  NULL
AVG_ROW_LENGTH  NULL
DATA_LENGTH NULL
MAX_DATA_LENGTH NULL
INDEX_LENGTH    NULL
DATA_FREE   NULL
AUTO_INCREMENT  NULL
CREATE_TIME NULL
UPDATE_TIME NULL
CHECK_TIME  NULL
TABLE_COLLATION NULL
CHECKSUM    NULL
CREATE_OPTIONS  NULL
TABLE_COMMENT  'View ''db_name.view_name'' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them'

このビューは、互いに結合された他のビューによって生成されたビューです。

5
Marcx

ビューの定義は、ダンプファイル内に含まれている必要があります。

定義を表示するには、ダンプファイルで次のコマンドを実行します。

cat backup.sql | grep -A 3 "CREATE ALGORITHM" > backup_views.sql
cat backup_views.sql

次に、問題のあるビューを削除して、手動で再作成できます。

ビューが既に確立されている別のサーバーがある場合は、スキーマのみをmysqldumpする必要があります。ビューも含まれます。 @ DTestと私はこれに関する以前の投稿を書きました

ビューは常にmysqldumpの最後に(すべてのテーブルの後)処理されます。

この問題は、あるビューが別のビューを参照し、ビューの作成順序がそれを考慮していない場合にも発生する可能性があります。

2
RolandoMySQLDBA

実際には、エラーレポートとして、これはビューの定義者/呼び出し元と関連付けることができます。通常、ビュー定義者がdb1であるuser1をバックアップしてから、db2などの別の名前でこのバックアップを復元すると、user1がこの新しいデータベース。

そのような場合、user1db2にマップするか、backup.sqlファイルでuser1user2に置き換えることができます(user2db2-本番データベースのバックアップを作成し、それをテストデータベースとして復元する通常の場合)。

詳細は this answer で読むことができます。

0
o.v