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

因为单个表语句不限定 dbspace,所以在这种情况下,表信息DB1.MYTABLE将被提取,因此DB2将使用来自的备份填充DB1

问题

有没有办法让备份来限定每个表语句上的 dbspace 名称,以便在USE这种情况下不需要该语句?例如

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用 dbspace 名称和TABLENAMEHERE表名替换 。因为 sed 的这种用法将USE在输出中包含语句,所以我们不需要在 mysql 命令行上限定要连接到哪个数据库。只要用户有权“使用”该空间,它就可以工作。但是,如果您想将它插入到不同的数据库空间(即临时),那么您将使用它。

使用它来将表从 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 回答