如何使用mysqldump在表语句中保留dbspace名称

时间:2013-01-30 16:52:08

标签: mysql mysqldump

背景

我们目前基本上像这样转储数据库:

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将填充来自{{1}的备份}}

问题

有没有办法让备份在每个表语句中限定dbspace名称,以便在这种情况下不需要DB1语句? E.g。

USE

1 个答案:

答案 0 :(得分: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命令行上限定要连接的数据库。只要用户具有“使用”该空间的权限,它就可以工作。但是如果你想将它插入另一个dbspace(即临时),那么你将使用它。

使用此命令将表从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