전체 MySQL 데이터베이스 복제


90

Linux 서버에서 전체 MySQL 데이터베이스를 복제 할 수 있습니까?

내보내기 및 가져 오기를 사용할 수 있지만 원래 데이터베이스는 25MB 이상이므로 이상적이지 않습니다.

mysqldump를 사용하거나 데이터베이스 파일을 직접 복제하여 가능합니까?

답변:


174

먼저 중복 데이터베이스를 만듭니다.

CREATE DATABASE duplicateddb;

사용자와 권한이 모두 제자리에 있는지 확인하고 다음을 수행하십시오.

 mysqldump -u admin -p originaldb | mysql -u backup -pPassword duplicateddb; 

29
나는 "-p"와 두번째 명령 행의 두 번째 부분에 "비밀"사이에 공백이 있어야한다 생각하지 않는다

16
공간이 없어야합니다! 대답은 이렇습니다. mysql man 페이지는 다음과 같이 말했습니다 : --password [= password], -p [password] 서버에 연결할 때 사용할 암호. 짧은 옵션 형식 (-p)을 사용하는 경우 옵션과 암호 사이에 공백이 없어야합니다. 명령 줄에서 --password 또는 -p 옵션 다음에 나오는 암호 값을 생략하면 mysql이 암호 값을 입력하라는 메시지를 표시합니다. 명령 줄에서 암호를 지정하는 것은 안전하지 않은 것으로 간주되어야합니다. 참조 섹션 6.1.2.1, "최종 사용자 P에 대한 가이드 라인 ...
petersohn NILS

2
mysqldump는 기본적으로 트리거를 백업하지만 저장 프로시 저는 백업하지 않습니다 --routines.이 경우 옵션으로 추가하십시오 .
LinuxDevOps 2014 년

1
이렇게하고 있고이 사용자의 MySQL 암호를 bash 기록에서 사용할 수 없도록하려면 ~/.bash_history실행 한 후 파일 에서 편집 하십시오. 또는 첫 번째 명령의 결과를 임시 파일로 출력하고 그 후에 다음을 실행할 수도 있습니다 (암호를 입력하라는 메시지가 표시됨) mysql -p -u admin duplicatedb < temporaryfile.sql.
Mike

1
이 답변은 확실히 작동하지만 "내가 내보내기 및 가져 오기를 사용할 수 있지만 원래 데이터베이스가 25MB 이상이므로 이상적이지 않습니다"라는 질문이 있으며이 답변이 제안하는 것은 기본적으로 내보내기 및 가져 오기입니다.
el.pescado


5

때때로 mysqldump를 수행하고 출력을 다른 mysql 명령으로 파이프하여 다른 데이터베이스로 가져옵니다.

mysqldump --add-drop-table -u wordpress -p wordpress | mysql -u wordpress -p wordpress_backup

이것을 사용할 때 dest 데이터베이스가 존재하지 않는다는 오류가 발생합니다. 따라서 CREATE DATABASE 라인도 필요합니다.
blak3r

3

데이터가있는 시스템에 mysqldump 파일을 만들고 파이프를 사용하여이 mysqldump 파일을 새 시스템에 대한 입력으로 제공합니다. 새 시스템은 ssh 명령을 사용하여 연결할 수 있습니다.

mysqldump -u user -p'password' db-name | ssh user@some_far_place.com mysql -u user -p'password' db-name

-p [password] 사이에 공백이 없습니다.


1
이것이 어떻게 작동하는지에 대한 설명을 추가 할 수 있습니까 (예 : 파이프 사용)?
kalyfe

1

여기에 Vincent와 Pauls의 제안을 결합한 Windows bat 파일이 있습니다. 사용자에게 소스 및 대상 이름을 묻는 메시지가 표시됩니다.

실행 파일 / 데이터베이스 포트에 대한 적절한 경로를 설정하려면 상단의 변수를 수정하기 만하면됩니다.

:: Creates a copy of a database with a different name.
:: User is prompted for Src and destination name.
:: Fair Warning: passwords are passed in on the cmd line, modify the script with -p instead if security is an issue.
:: Uncomment the rem'd out lines if you want script to prompt for database username, password, etc.

:: See also: http://stackoverflow.com/questions/1887964/duplicate-entire-mysql-database

@set MYSQL_HOME="C:\sugarcrm\mysql\bin"
@set mysqldump_exec=%MYSQL_HOME%\mysqldump
@set mysql_exec=%MYSQL_HOME%\mysql
@set SRC_PORT=3306
@set DEST_PORT=3306
@set USERNAME=TODO_USERNAME
@set PASSWORD=TODO_PASSWORD

:: COMMENT any of the 4 lines below if you don't want to be prompted for these each time and use defaults above.
@SET /p USERNAME=Enter database username: 
@SET /p PASSWORD=Enter database password: 
@SET /p SRC_PORT=Enter SRC database port (usually 3306): 
@SET /p DEST_PORT=Enter DEST database port: 

%MYSQL_HOME%\mysql --user=%USERNAME% --password=%PASSWORD% --port=%DEST_PORT% --execute="show databases;"
@IF NOT "%ERRORLEVEL%" == "0" GOTO ExitScript

@SET /p SRC_DB=What is the name of the SRC Database:  
@SET /p DEST_DB=What is the name for the destination database (that will be created):  

%mysql_exec% --user=%USERNAME% --password=%PASSWORD% --port=%DEST_PORT% --execute="create database %DEST_DB%;"
%mysqldump_exec% --add-drop-table --user=%USERNAME% --password=%PASSWORD% --port=%SRC_PORT% %SRC_DB% | %mysql_exec% --user=%USERNAME% --password=%PASSWORD% --port=%DEST_PORT% %DEST_DB%
@echo SUCCESSFUL!!!
@GOTO ExitSuccess

:ExitScript
@echo "Failed to copy database"
:ExitSuccess

샘플 출력 :

C:\sugarcrm_backups\SCRIPTS>copy_db.bat
Enter database username: root
Enter database password: MyPassword
Enter SRC database port (usually 3306): 3308
Enter DEST database port: 3308

C:\sugarcrm_backups\SCRIPTS>"C:\sugarcrm\mysql\bin"\mysql --user=root --password=MyPassword --port=3308 --execute="show databases;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sugarcrm_550_pro   |
| sugarcrm_550_ce    |
| sugarcrm_640_pro   |
| sugarcrm_640_ce    |
+--------------------+
What is the name of the SRC Database:  sugarcrm
What is the name for the destination database (that will be created):  sugarcrm_640_ce

C:\sugarcrm_backups\SCRIPTS>"C:\sugarcrm\mysql\bin"\mysql --user=root --password=MyPassword --port=3308 --execute="create database sugarcrm_640_ce;"

C:\sugarcrm_backups\SCRIPTS>"C:\sugarcrm\mysql\bin"\mysqldump --add-drop-table --user=root --password=MyPassword --port=3308 sugarcrm   | "C:\sugarcrm\mysql\bin"\mysql --user=root --password=MyPassword --port=3308 sugarcrm_640_ce
SUCCESSFUL!!!

1

InnoDB에서는 작동하지 않습니다. MyISAM 데이터베이스를 복사하려는 경우에만이 해결 방법을 사용하십시오.

백업 중에 테이블을 잠그고 데이터베이스 가져 오기 중에 MySQL을 일시 중지하는 것이 허용되는 경우 mysqlhotcopy 가 더 빠르게 작동 할 수 있습니다.

지원:

# mysqlhotcopy -u root -p password db_name /path/to/backup/directory

복원:

cp /path/to/backup/directory/* /var/lib/mysql/db_name

mysqlhotcopy 는 또한 SSH (scp)를 통해 파일을 전송할 수 있으며, 가능하면 중복 데이터베이스 디렉토리로 바로 전송할 수 있습니다.

# mysqlhotcopy -u root -p password db_name /var/lib/mysql/duplicate_db_name

1

데이터베이스 복사본 만들기

# mysqldump -u root -p password db1 > dump.sql
# mysqladmin -u root -p password create db2
# mysql -u root -p password db2 < dump.sql

0

이것은 mysql 쉘 외부에서 명령 프롬프트로 나를 위해 일했습니다.

# mysqldump -u root -p password db1 > dump.sql
# mysqladmin -u root -p password create db2
# mysql -u root -p password db2 < dump.sql

이것은 나를 가장 좋은 방법으로 찾습니다. "dump.sql"을 압축하면 압축 된 백업으로 저장할 수 있습니다. 멋있는! Innodb 테이블이있는 1GB 데이터베이스의 경우 "dump.sql"을 만드는 데 약 1 분, 새 DB db2에 데이터를 덤프하는 데 약 3 분이 걸립니다.

hole db 디렉토리 (mysql / data / db1)를 직접 복사하는 것은 InnoDB 테이블 때문에 작동하지 않았습니다.


-2

옛날 옛적에 MySQL에서는 모든 테이블 파일을 mysql 트리의 다른 디렉토리에 복사 할 수 있습니다.

mysql cli-데이터베이스 db2 생성

리눅스 cli-cp db1 db2


그것은 MyISAM에서만 작동합니다. 그 나쁜 옛날은 사라졌습니다.
Laurenz Albe

역사 책에는 좋지만 더 이상 유용하지는 않습니다.
JJJ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.