Я использую MySQLDump через системные вызовы для экспорта таблиц из одной базы данных и их импорта (выборочно) на другой. Моя проблема заключается в том, что на исходном сервере базы данных некоторые таблицы находятся в другом (зашифрованном) каталоге, а на целевом сервере нет целевого каталога данных.MySQLDump без 'DATA DIRECTORY'
Моя текущая команда выглядит примерно так:
mysqldump --skip-opt --skip-comments --no-create-db --disable-keys
--extended-insert --quick --create-options --login-path=sourcedb
source_database_name source_table |
mysql --login-path=targetdb target_database_name
В этих таблицах хранятся на зашифрованном диске, свалка выглядит примерно так:
/*!40103 SET @[email protected]@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @[email protected]@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @[email protected]@SQL_NOTES, SQL_NOTES=0 */;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `AnExampleTable` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`type_id` int unsigned DEFAULT NULL COMMENT 'FK The system type.',
`resource` varchar(64) DEFAULT NULL COMMENT,
`created_at` timestamp DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`ActionSystemPendingId`),
UNIQUE KEY `resource_type` (`type_id`,`resource`),
KEY `created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 DATA DIRECTORY='/mnt/mysqlEncrpyted/';
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `AnExampleTable` DISABLE KEYS */;
-- data inserts
/*!40000 ALTER TABLE `AnExampleTable` ENABLE KEYS */;
/*!40103 SET [email protected]_TIME_ZONE */;
/*!40101 SET [email protected]_SQL_MODE */;
/*!40014 SET [email protected]_FOREIGN_KEY_CHECKS */;
/*!40014 SET [email protected]_UNIQUE_CHECKS */;
/*!40111 SET [email protected]_SQL_NOTES */;
По сути все, что я хочу это сделать DATA DIRECTORY='/mnt/mysqlEncrpyted/'
из запроса, не прибегая к sed
.
Это делается (как я сказал) через системные вызовы, а некоторые таблицы точны, потому что они не живут в специальном каталоге данных. Все, что я хочу, это флаг, который вытесняет его.
В конце концов, я просто передал его через sed. Не очень красивое решение, но оно сработало. – samlev
Я написал (и продолжаю работать) утилиту, в настоящее время внутреннюю, но которую я планирую в конечном итоге выпустить, с термическим названием «my-dump-filter», который понимает формат вывода mysqldump и может переписывать файлы дампа как поток. такие как переписывание имен баз данных, включение/исключение целых схем из списка имен, изменение механизмов хранения, разделение определений таблиц и данных на отдельные файлы, удаление операторов 'DEFINER' (для Amazon RDS). Я добавлю удаление или изменение каталога данных в список пожеланий. –