我们目前基本上像这样转储数据库:
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
答案 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