2009-12-16 5 views
3

동일한 웹 애플리케이션의 데이터를 나타내는 거의 동일한 구조를 가진 두 개의 mysql 데이터베이스가 있지만 그 중 하나는 현재 버전을 나타내고 두 번째 데이터베이스는 오래 전에 작성되었습니다.mysqldump 테이블 이름 접두어

두 덤프를 모두 사용하여 데이터베이스를 만들 수 있지만 첫 번째 테이블의 접두사 old_ 접두사와 두 번째 데이터베이스의 테이블 접두어 new_ 접두어가 있습니까?

접두어 나 다른 솔루션을 설정하기위한 mysqldump 옵션이 있습니까?

답변

1
  1. 는 데이터베이스를 모두 복원합니다.
  2. 접두사를 추가 한 후 한 DB에서 다른 DB로 모든 테이블을 이동하려면 다음 저장 프로 시저를 사용하십시오.
  3. 이동 후 원본 데이터베이스를 삭제하십시오.

이 저장 프로시 저는 information_schema에있는 MySQL의 메모리 테이블에서 테이블 목록을 가져오고 RENAME 명령을 사용하여 자동으로 다른 DB로 이동합니다.

DELIMITER $$ 

USE `db`$$ 

DROP PROCEDURE IF EXISTS `renameDbTables`$$ 

CREATE DEFINER=`db`@`%` PROCEDURE `renameDbTables`(
    IN from_db VARCHAR(20), 
    IN to_db VARCHAR(30), 
    IN to_name_prefix VARCHAR(20) 
) 
BEGIN 
/* 
call db.renameDbTables('db1','db2','db_'); 
db1.xxx will be renamed to db2.db_xxx 
*/ 
    DECLARE from_state_table VARCHAR(20) DEFAULT ''; 
    DECLARE done INT DEFAULT 0; 
    DECLARE b VARCHAR(255) DEFAULT ''; 
    DECLARE cur1 CURSOR FOR SELECT TABLE_NAME FROM information_schema.TABLES 
     WHERE TABLE_SCHEMA=from_db; 
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; 

    OPEN cur1; 

    REPEAT 
     FETCH cur1 INTO from_state_table; 
     IF NOT done THEN 
--   select from_state_table; 
      SET @QUERY = ''; 
      SET @QUERY = CONCAT(@QUERY,'RENAME TABLE ',from_db,'.', from_state_table,' TO ',to_db,'.', to_name_prefix, from_state_table,';'); 
--   SELECT @query; 
      PREPARE s FROM @QUERY; 
      EXECUTE s; 
      DEALLOCATE PREPARE s; 
     END IF; 
    UNTIL done END REPEAT; 
    CLOSE cur1; 
    END$$ 

DELIMITER ; 
0

다른 데이터베이스로 가져옵니다. 그들은 newdbolddb이라고합니다.

select concat('insert into newdb.old_', table_name, 
    'select * from olddb.', table_name, ';') 
from information_schema.tables 
where table_schema = 'olddb' 
+0

아직 복사되지 않은 테이블에 따라 테이블에 제약 조건이있는 경우 –

1

A "mysqldump는 파일이"전체 단지 텍스트 파일입니다 : 당신이 테이블의 거대한 숫자가있는 경우

insert into newdb.old_table1 
select * 
from olddb.table1 

이 복사하는 스크립트를 생성 : 그럼 당신은 같은 old_table1에 표를 복사 할 수 있습니다 SQL 문을 사용할 수 있으므로 텍스트 편집기에서 이와 같이 빠르게 수정할 수 있습니다.

1) 두 데이터베이스를 개별적으로 덤프하십시오.

2) "이전"덤프 파일 편집 :

  • 검색을 할 올바른 use mydatabase; 라인
  • 을 추가하고 테이블 이름 앞에 old_을 추가 교체를.

3) 그런 다음 나는 과거에 mysqldumpsed을 사용하여 다음과 같은 짓을하지만, 나는 그것이 만에 하나 개의 테이블에 대한 효과적 일 수 인정한다 mysql < combined_dump

+1

+1 이러한 파일은 매우 클 수 있지만 괜찮은 텍스트 편집기 (예 : notepad ++)를 사용하여 변경해야합니다. 또 다른 방법은 하나의 덤프에 '--no-data'플래그를 사용하고 두 번째 덤프에는 '--no-create-info'를 사용하는 것입니다. 이렇게하면 초기 편집을 수행하는 데 필요한 파일이 줄어들어 원하는 파일을 정확하게 만들 수 있습니다. 두 번째 파일 테이블의 이름을 변경해야합니다. 그렇지 않으면 이전 파일의 내용을 새 파일의 테이블에 넣을 수 있습니다. – aronchick

+0

@aronchick +1 on bigness. 일부 편집자는 수 메가 바이트 길이의 라인을 만날 때 절대적으로 충돌하고 화상을 입습니다 (mysqldump 파일의 데이터는 모두 한 줄에 거대한 삽입 문입니다). – Seth

0

, cat dump1 dump2 > combined_dump

4) 시각.

$ mysqldump -u user --password=mypass MyDB MyTable | sed s/MyTable/old_Mytable/ | mysql -u other_user -p NewDB 

당신은 명령, 각 테이블에 하나, 혹은 다른 사용자가 한 번에 효과적으로 다중 테이블에 대한 작업이를 수정하는 방법이 목록이 쉘 스크립트를 만들 수 있습니다. 그대로

피어

0

내가 문제를 오해 할 수 있지만, 기존의 테이블이 하나의 스키마와 새 테이블로가는과 함께 DBS를 복원하는 데 사용되는 단일 SQL 파일에이 데이터베이스를 덤프하려는 것처럼 소리 다른 사람에게 들어가는 것.

이 작업을 수행하려는 경우 가장 간단한 방법은 각 "덤프"전에 적절한 "데이터베이스 사용"명령을 삽입하는 것입니다. 그래서 같이

:

echo "use old_db;" > /tmp/combined_dump.sql 
mysqldump old_db >> /tmp/combined_dump.sql 
echo "use new_db;" >> /tmp/combined_dump.sql 
mysqldump new_db >> /tmp/combined_dump.sql 
2

이 나오지 스크립트가 아마 조금 더 안전합니다. 이것을 파일에 저장하고 sed -f를 사용하여 덤프 파일을 필터링하십시오.

s/\(-- Table structure for table `\)\([^`]\+\)\(`\)/\1xyzzy_\2\3/ 
s/\(DROP TABLE IF EXISTS `\)\([^`]\+\)\(`\)/\1xyzzy_\2\3/ 
s/\(CREATE TABLE `\)\([^`]\+\)\(` (\)/\1xyzzy_\2\3/ 
s/\(-- Dumping data for table `\)\([^`]\+\)\(`\)/\1xyzzy_\2\3/ 
s/\(\/\*!40000 ALTER TABLE `\)\([^`]\+\)\(` DISABLE KEYS \*\/\)/\1xyzzy_\2\3/ 
s/\(LOCK TABLES `\)\([^`]\+\)\(` WRITE\)/\1xyzzy_\2\3/ 
s/\(INSERT INTO `\)\([^`]\+\)\(` VALUES (\)/\1xyzzy_\2\3/ 
s/\(\/\*!40000 ALTER TABLE `\)\([^`]\+\)\(` ENABLE KEYS \*\/\)/\1xyzzy_\2\3/ 

xyzzy_를 검색하여 원하는 테이블 접두어로 바꾸십시오.

+0

충분하지 않습니다. 당신은 제약 조건을 다뤄야 만합니다. –