0

バックグラウンド

現在、基本的に次のようにデータベースをダンプしています。

mysqldump --complete-insert --opt --hex-blob --all-databases -u -p

ダンプは次のようになります。

USE `DB1`

-- Table structure for table `MYTABLE`
DROP TABLE IF EXISTS `MYTABLE`
CREATE TABLE `MYTABLE`
...
INSERT INTO `MYTABLE` ...

-- Table structure for table `NEXTABLE`
...

USE `DB2`

-- Table structure for table `MYTABLE`
DROP TABLE IF EXISTS `MYTABLE`
CREATE TABLE `MYTABLE`
...
INSERT INTO `MYTABLE` ...

-- Table structure for table `NEXTABLE`

問題

一部のリカバリ シナリオでは、バックアップから特定のテーブルをプルする必要があります。次のようにします。

cat backup | sed -n -e '/Table structure for table .MYTABLE.$/,/Table structure for table .NEXTABLE.$/p' | mysql -u -p DB2

個々のテーブル ステートメントは DB 領域を修飾しないため、この場合、テーブル情報DB1.MYTABLEが抽出され、次DB2のバックアップが取り込まれます。DB1

質問

USEこのシナリオでステートメントが不要になるように、バックアップを取得して各テーブル ステートメントの DB 領域名を修飾する方法はありますか? 例えば

USE `DB2`

-- Table structure for table `DB2`.`MYTABLE`
DROP TABLE IF EXISTS `DB2`.`MYTABLE`
CREATE TABLE `DB2`.`MYTABLE`
...
INSERT INTO `DB2`.`MYTABLE` ...

-- Table structure for table `DB2`.`NEXTABLE`
4

1 に答える 1

0

回答がなく、スペース名をダンプに追加する方法がないように見えるため、ダンプを別の方法でスキャンする必要があります。また、これは復旧シナリオであるため、既にデータベースをダンプした方法を単純に変更することはできません。その時点では遅すぎるためです。

スペース内のテーブル名は一意であるため、最終的に行ったのは、最初にダンプ内の dbspace 命令を分離し、次にそのテーブルを分離することでした。

これを使用して、テーブルを dump.sql から元の同じスペースに復元します。

sed  -n '/^USE .SPACENAMEHERE.;$/,/^USE .*$/p' dump.sql | sed -E -n '/^(USE .*;|-- Table structure for table .TABLENAMEHERE.)$/,/^-- Table structure for table /p' | mysql -u -p

SPACENAMEHEREを DB 領域名とTABLENAMEHEREテーブル名に置き換えます。sed をこのように使用するとUSE出力にステートメントが含まれるため、mysql コマンド ラインで接続するデータベースを修飾する必要はありません。ユーザーがそのスペースを「使用」する権限を持っている限り、それは機能します。しかし、これを別の DB 領域 (つまり、一時的) に挿入したい場合は、これを使用します。

これを使用して、テーブルを dump.sql から別のスペース (一時的なスペースなど) に復元します。

sed  -n '/^USE .SPACENAMEHERE.;$/,/^USE .*$/p' dump.sql | sed -E -n '/^-- Table structure for table .TABLENAMEHERE.$/,/^-- Table structure for table /p' | mysql -u -p DESTINATIONSPACE
于 2013-04-13T16:26:28.640 に答える