동일한 서버에서 MySQL 데이터베이스를 복제하는 방법
MySQL 데이터베이스라고 .live_db
가지고 놀 수 있는 ( 「 test_db
이치으로 업데이트 test_db
의 live_db
; ; ; ; ;의
"MySQL" "MySQL" "MySQL" "MySQL" "MySQL" "MySQL" "MySQL" "MySQL"? 슬레이브 는 데이터 변경이 에 원하는 것이 합니다.test_db
다만, 이러한 변경을 보존할 필요는 없습니다.
안부 전해요,
CGD
mysql
명령줄 클라이언트는 표준 입력에서 SQL 문의 스트림을 받아들입니다. '배관하다'의 할 수 있습니다.mysqldump
directly에 .mysql
커맨드 라인에 표시됩니다.으로 실행하면 가 갱신된 데이터로 .cron은 갱신된 라이브 데이터로 덮어씁니다.
mysql --user=username --password=passwd -e 'DROP DATABASE test_db;'
mysql --user=username --password=passwd -e 'CREATE DATABASE test_db;'
mysqldump --user=username --password=passwd live_db | mysql --user=username --password=passwd test_db
데이터가 크기 때문에 시간이 오래 걸립니다.
Michaels의 답변은 잘 작동하지만 이벤트, 저장 프로시저 또는 트리거를 복사하지 않습니다.
스위치를 mysqldump에 몇 개의 스위치가 더 필요합니다.mysqldump는 mysqldump를 사용합니다.--events --triggers --routines
이미 작성된 복사본을 보완하려면:
mysqldump --user=username --password=passwd --no-data --no-create-info --no-create-db --events --triggers --routines live_db | mysql --user=username --password=passwd test_db
저는 이것을 소규모에서 중규모 데이터베이스(1G에서 100G)로 몇 년 동안 다른 맥락에서 수행해 왔습니다. ★★★★★★★★★★★★★★★★★★★★★★★★★★★★」mysqldump
이치노
5-10GB를 초과하면 MySQL 로드에 따라 빠르고 더티해도 더 이상 잘리지 않습니다.
?mysqldump
MySQLdump의 문제는 덤프 중에 라이브 데이터베이스를 사용할 수 없거나 사용하기 매우 불편하거나 백업이 일관되지 않는다는 것입니다.데이터베이스를 사용할 필요가 없기 때문에(예를 들어 심야 등) 라이브 데이터베이스의 비정상성이 중요하지 않은 경우, 충분한 시간 창을 가지고 있지 않은 경우.
디폴트 옵션(여기에서는 그 이유에 대해 설명합니다)에서는 데이터를 읽기만 하는 경우가 아니면 덤프 중에 데이터베이스를 사용할 수 없게 됩니다.번잡한 e커머스 사이트에서는 클라이언트 연쇄 크래시가 발생하고 있습니다.
InnoDB와 최신 옵션을 사용하고 있는 것으로 알고 있습니다(기본값이 아닌 것으로 알고 있습니다).
--single-transaction --skip-lock-tables
이를 통해 사이트가 정상보다 느리지만 덤프 중에 실행될 수 있습니다.용도에 따라서는, 현저하게 늦어질 수 있습니다.
그 사이에, 중요한 다른 데이터도 덤프 해 주세요.
--events --triggers --routines
(...아, 그래도 사용자 권한은 덤프되지 않습니다.테스트로서 사용하는 것은 그다지 중요하지 않았을지도 모릅니다).
「대단한 해킹」으로서 「어드바이스」(!)라고 하는 회피책이 있습니다.이것에 의해, 트랜잭션의 정합성이 무효가 되어, 폐기중에 데이타베이스를 풀 스피드로 실행할 수 있게 됩니다.가볍게 하기 위해 브레이크를 해제하고 더 빨리 작동시키는 것과 비슷합니다. 네, 작동하지만 여러분이 바로 알아차리지 못할 수도 있는 부작용이 있습니다.당신은 조만간 그것들을 거의 확실히 알아차릴 것이다 - 그리고 브레이크와 마찬가지로, 그것은 여러분이 그것들을 가장 필요로 할 때일 것이다, 그리고 그것은 예쁘지 않을 것이다.
단, 테스트 데이터베이스의 경우 동작할 수 있습니다.
Xtrabackup
"심각한" 데이터베이스가 있는 경우 "심각한" 백업이 없는 이유는 무엇입니까?
슬레이브 리플리케이션
여유 공간이 있는 경우에는 보조 데이터베이스를 사용할 수도 있습니다.
MySQL Server의 두 번째 복사본을 다른 포트의 동일한 서버에 설치하여 슬레이브로 만들 수 있습니다(서버는 스토리지 속도에 따라 성능에 영향을 미칩니다).그러면 두 개의 동일한 데이터베이스(라이브 마스터, 라이브 슬레이브)가 생성됩니다.처음부터 풀 덤프를 실행하여 모든 문제를 동기화해야 합니다.
테스트 데이터베이스를 복제해야 할 경우 슬레이브 복제를 중지하고 MySQL 백업을 사용하거나 데이터 파일만 복사하여 라이브 슬레이브를 테스트 DB에 백업합니다.완료되면 복제를 재시작합니다.
라이브 마스터에 대한 영향은 무시할 수 있으며 업데이트 크리티컬하지 않은 선택에 실제로 슬레이브를 사용할 수 있습니다.
MySQL Migration Toolkit을 원하는 경우 Data Mapping 단계에서 스키마 이름을 더블 클릭하여 대상 스키마 이름을 변경할 수 있습니다.
모든 Mac 사용자는 sequel pro에서 데이터베이스(메뉴)-> 중복 데이터베이스로 이동하기만 하면 됩니다.알았어!
이 솔루션은 정상적으로 동작하지만, 유닛 테스트에 PHPunit을 사용하고 있는 경우는 문제가 되지 않습니다.
명령줄에서 암호를 사용하면 PHPUnit에 의해 경고가 생성되고 예외가 생성됩니다(예: 큰 문제...).
이 문제를 해결하려면 컨피규레이션파일을 사용합니다.
제 경우 설정 파일과 PHP 코드에 비밀번호와 사용자를 모두 유지하고 싶지 않기 때문에 코드에서 설정 파일을 생성하고 해당 파일이 존재하는지 확인합니다(그렇지 않으면 사용자 이름과 비밀번호를 폴백 옵션으로 직접 명령줄에 사용합니다).
여기 PHP의 예가 있습니다.셋업 데이터베이스를 복사하여 다른 이름으로 새 도메인을 만드는 방법(예를 들어 고객마다 다른 서브 도메인/데이터베이스를 사용하여 메인 도메인을 관리하는 경우)입니다.
/**
* If the $dbName doesn't exist, then create it.
*
* @param $errorMessage String to return the error message.
* @param $dbName String name of the database to create.
* @param $cleanExisting Boolean if the database exist, clear it to recreate it.
*
* @return boolean ($dbExists)
*/
private function createDatabase(&$errorMessage, $dbName, $clearExisting = false){
$command = "";
$configurationString = "[client]" . "\r\n" . "user=" . parent::$support_user . "\r\n" . "password=" . md5(parent::$support_pass);
$dbExist = false;
$path = realpath(dirname(__FILE__));
$connectionString = " --defaults-extra-file=" . $path . "\mysql.cnf ";
$dbName = strtolower($dbName);
if ($this->isDestinationDbNameValid($errorMessage, $dbName)) {
$dbExist = $this->isDestinationDbExist($errorMessage, $dbName);
if (empty($errorMessage) and ($dbExist === false or $clearExisting === true)) {
if (file_put_contents($path . '/mysql.cnf', $configurationString) === false) {
$connectionString = " --user=" . parent::$support_user . " --password=" . md5(parent::$support_pass). " ";
}
if ($dbExist and $clearExisting) {
$command = $path . '/../../../mysql/bin/mysql ' . $connectionString . ' --execute="DROP DATABASE ' . $dbName .';" &';
}
$command .= '"' . $path . '/../../../mysql/bin/mysql" ' . $connectionString . ' --execute="CREATE DATABASE ' . $dbName . ';" &"' .
$path . '/../../../mysql/bin/mysqldump" ' . $connectionString . ' --events --triggers --routines setup | "' .
$path . '/../../../mysql/bin/mysql" ' . $connectionString . $dbName;
exec($command);
$dbExist = $this->isDestinationDbExist($errorMessage, $dbName);
if (!$dbExist) {
$errorMessage = parent::getErrorMessage("COPY_SETUP_DB_ERR", "An error occurred during the duplication process of the setup database.");
}
}
}
return $dbExist;
}
기타 주의사항:
SQL 문에 작은따옴표(') 대신 큰따옴표(")를 사용해야 했습니다.
다른 명령어를 분리하기 위해 앰퍼샌드(&)를 사용해야 했습니다.
이 예에서는 새 데이터베이스 이름(isDestinationDbNameValid() 메서드)의 검증은 포함되지 않습니다.사용자 입력을 절대 신뢰해서는 안 된다는 것은 말할 필요도 없습니다.
또한 데이터베이스 복사가 예상대로 동작하는지 확인하기 위해 커스텀 메서드를 작성해야 합니다(isDestinationDb).Exist() 메서드).적어도 데이터베이스가 존재하는지, 설치에서 가져온 테이블이 존재하는지, 저장된 프로그램에 대한 검증(선택 사항)을 수행해야 합니다.
무력을 현명하게 사용하라, 친구들아.
몬트리올에서 온 조나단 파더-레베스크
언급URL : https://stackoverflow.com/questions/6652136/how-to-duplicate-a-mysql-database-on-the-same-server
'it-source' 카테고리의 다른 글
vue에서 sass 변수를 재정의하려면 어떻게 해야 합니까? (0) | 2022.12.19 |
---|---|
엔티티 프레임워크 MariaDb 문자열 날짜 문제 (0) | 2022.12.19 |
부모 POM에서 상속받은 아티팩트를 제외할 수 있는 방법이 있습니까? (0) | 2022.12.19 |
크리스마스 트리는 어떻게 감지하나요? (0) | 2022.12.19 |
Spring-Data-JPA 주석을 위한 setMaxResults? (0) | 2022.12.19 |