전체 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.