mysqldump를 사용하지 않고 데이터베이스 복사 / 복제
서버에 로컬로 액세스하지 않으면 MySQL 데이터베이스 (콘텐츠가 있고 내용이없는)를 사용하지 않고 다른 데이터베이스로 복제 / 복제 할 수있는 방법이 mysqldump
있습니까?
현재 MySQL 4.0을 사용하고 있습니다.
님이 사용하고 싶지 않다고 말 mysqldump
했지만 유사한 솔루션을 찾는 동안이 페이지에 도달했으며 다른 사람들도 찾을 수 있습니다. 이를 염두에두고 Windows 서버의 명령 행에서 데이터베이스를 복제하는 간단한 방법이 있습니다.
- MySQLAdmin 또는 선호하는 방법을 사용하여 대상 데이터베이스를 작성하십시오. 이 예에서는
db2
소스 데이터베이스db1
가 복사 될 대상 데이터베이스 입니다. - 명령 행에서 다음 명령문을 실행하십시오.
mysqldump -h [server] -u [user] -p[password] db1 | mysql -h [server] -u [user] -p[password] db2
참고 : -p
와 사이에 공백이 없습니다[password]
다음을 실행하여 데이터없이 테이블을 복제 할 수 있습니다.
CREATE TABLE x LIKE y;
( MySQL CREATE TABLE 문서 참조)
SHOW TABLES
한 데이터베이스에서 출력을 가져 와서 스키마를 다른 데이터베이스로 복사 하는 스크립트를 작성할 수 있습니다. 다음과 같은 스키마 + 테이블 이름을 참조 할 수 있어야합니다.
CREATE TABLE x LIKE other_db.y;
데이터가 진행되는 한 MySQL에서도 데이터를 처리 할 수 있지만 반드시 빠르지는 않습니다. 참조를 만든 후 다음을 실행하여 데이터를 복사 할 수 있습니다.
INSERT INTO x SELECT * FROM other_db.y;
MyISAM을 사용하는 경우 테이블 파일을 복사하는 것이 좋습니다. 훨씬 빠릅니다. 테이블 테이블 스페이스마다 INNODB를 사용하는 경우 동일한 작업을 수행 할 수 있어야 합니다 .
당신이 일을 끝낼 경우 INSERT INTO SELECT
, 일시적으로 반드시 인덱스를 해제 와 함께 ALTER TABLE x DISABLE KEYS
!
편집 Maatkit 에는 데이터 동기화에 도움이되는 스크립트도 있습니다. 더 빠르지는 않지만 많은 잠금없이 라이브 데이터에서 동기화 스크립트를 실행할 수 있습니다.
Linux를 사용하는 경우이 bash 스크립트를 사용할 수 있습니다. (추가 코드 정리가 필요하지만 작동하지만 ... mysqldump | mysql보다 훨씬 빠릅니다)
#!/bin/bash
DBUSER=user
DBPASSWORD=pwd
DBSNAME=sourceDb
DBNAME=destinationDb
DBSERVER=db.example.com
fCreateTable=""
fInsertData=""
echo "Copying database ... (may take a while ...)"
DBCONN="-h ${DBSERVER} -u ${DBUSER} --password=${DBPASSWORD}"
echo "DROP DATABASE IF EXISTS ${DBNAME}" | mysql ${DBCONN}
echo "CREATE DATABASE ${DBNAME}" | mysql ${DBCONN}
for TABLE in `echo "SHOW TABLES" | mysql $DBCONN $DBSNAME | tail -n +2`; do
createTable=`echo "SHOW CREATE TABLE ${TABLE}"|mysql -B -r $DBCONN $DBSNAME|tail -n +2|cut -f 2-`
fCreateTable="${fCreateTable} ; ${createTable}"
insertData="INSERT INTO ${DBNAME}.${TABLE} SELECT * FROM ${DBSNAME}.${TABLE}"
fInsertData="${fInsertData} ; ${insertData}"
done;
echo "$fCreateTable ; $fInsertData" | mysql $DBCONN $DBNAME
PHP에서 :
function cloneDatabase($dbName, $newDbName){
global $admin;
$db_check = @mysql_select_db ( $dbName );
$getTables = $admin->query("SHOW TABLES");
$tables = array();
while($row = mysql_fetch_row($getTables)){
$tables[] = $row[0];
}
$createTable = mysql_query("CREATE DATABASE `$newDbName` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;") or die(mysql_error());
foreach($tables as $cTable){
$db_check = @mysql_select_db ( $newDbName );
$create = $admin->query("CREATE TABLE $cTable LIKE ".$dbName.".".$cTable);
if(!$create) {
$error = true;
}
$insert = $admin->query("INSERT INTO $cTable SELECT * FROM ".$dbName.".".$cTable);
}
return !isset($error);
}
// usage
$clone = cloneDatabase('dbname','newdbname'); // first: toCopy, second: new database
mysql 유틸리티에 대한 추가의 일부로 mysqldbcopy 명령이 있습니다 .... https://dev.mysql.com/doc/mysql-utilities/1.5/en/utils-task-clone-db.html
"로컬 액세스"가 무엇을 의미하는지 잘 모르겠습니다. 그러나이 솔루션의 경우 ssh를 통해 서버에 액세스하여 데이터베이스가 저장된 파일 을 복사 할 수 있어야합니다 .
내 데이터베이스가 커서 (7Go, mysqldump 실패) mysqldump를 사용할 수 없습니다. 2 mysql 데이터베이스의 버전이 너무 다르면 작동하지 않을 수 있습니다. mysql -V를 사용하여 mysql 버전을 확인할 수 있습니다.
1) 원격 서버에서 로컬 컴퓨터로 데이터를 복사하십시오 (vps는 원격 서버의 별명이며 root@1.2.3.4로 대체 가능)
ssh vps:/etc/init.d/mysql stop
scp -rC vps:/var/lib/mysql/ /tmp/var_lib_mysql
ssh vps:/etc/init.d/apache2 start
2) 로컬 컴퓨터에 복사 된 데이터 가져 오기
/etc/init.d/mysql stop
sudo chown -R mysql:mysql /tmp/var_lib_mysql
sudo nano /etc/mysql/my.cnf
-> [mysqld]
-> datadir=/tmp/var_lib_mysql
/etc/init.d/mysql start
다른 버전을 사용하는 경우 다음을 실행해야 할 수 있습니다.
/etc/init.d/mysql stop
mysql_upgrade -u root -pPASSWORD --force #that step took almost 1hrs
/etc/init.d/mysql start
이전의 모든 솔루션은 요점에 조금만 도달하지만 모든 것을 복사하지는 않습니다. 테이블, 외래 키, 데이터, 뷰, 프로 시저, 함수, 트리거 및 이벤트를 포함한 모든 것을 복사하는 PHP 함수 (약간 길지만)를 만들었습니다. 코드는 다음과 같습니다.
/* This function takes the database connection, an existing database, and the new database and duplicates everything in the new database. */
function copyDatabase($c, $oldDB, $newDB) {
// creates the schema if it does not exist
$schema = "CREATE SCHEMA IF NOT EXISTS {$newDB};";
mysqli_query($c, $schema);
// selects the new schema
mysqli_select_db($c, $newDB);
// gets all tables in the old schema
$tables = "SELECT table_name
FROM information_schema.tables
WHERE table_schema = '{$oldDB}'
AND table_type = 'BASE TABLE'";
$results = mysqli_query($c, $tables);
// checks if any tables were returned and recreates them in the new schema, adds the foreign keys, and inserts the associated data
if (mysqli_num_rows($results) > 0) {
// recreates all tables first
while ($row = mysqli_fetch_array($results)) {
$table = "CREATE TABLE {$newDB}.{$row[0]} LIKE {$oldDB}.{$row[0]}";
mysqli_query($c, $table);
}
// resets the results to loop through again
mysqli_data_seek($results, 0);
// loops through each table to add foreign key and insert data
while ($row = mysqli_fetch_array($results)) {
// inserts the data into each table
$data = "INSERT IGNORE INTO {$newDB}.{$row[0]} SELECT * FROM {$oldDB}.{$row[0]}";
mysqli_query($c, $data);
// gets all foreign keys for a particular table in the old schema
$fks = "SELECT constraint_name, column_name, table_name, referenced_table_name, referenced_column_name
FROM information_schema.key_column_usage
WHERE referenced_table_name IS NOT NULL
AND table_schema = '{$oldDB}'
AND table_name = '{$row[0]}'";
$fkResults = mysqli_query($c, $fks);
// checks if any foreign keys were returned and recreates them in the new schema
// Note: ON UPDATE and ON DELETE are not pulled from the original so you would have to change this to your liking
if (mysqli_num_rows($fkResults) > 0) {
while ($fkRow = mysqli_fetch_array($fkResults)) {
$fkQuery = "ALTER TABLE {$newDB}.{$row[0]}
ADD CONSTRAINT {$fkRow[0]}
FOREIGN KEY ({$fkRow[1]}) REFERENCES {$newDB}.{$fkRow[3]}({$fkRow[1]})
ON UPDATE CASCADE
ON DELETE CASCADE;";
mysqli_query($c, $fkQuery);
}
}
}
}
// gets all views in the old schema
$views = "SHOW FULL TABLES IN {$oldDB} WHERE table_type LIKE 'VIEW'";
$results = mysqli_query($c, $views);
// checks if any views were returned and recreates them in the new schema
if (mysqli_num_rows($results) > 0) {
while ($row = mysqli_fetch_array($results)) {
$view = "SHOW CREATE VIEW {$oldDB}.{$row[0]}";
$viewResults = mysqli_query($c, $view);
$viewRow = mysqli_fetch_array($viewResults);
mysqli_query($c, preg_replace("/CREATE(.*?)VIEW/", "CREATE VIEW", str_replace($oldDB, $newDB, $viewRow[1])));
}
}
// gets all triggers in the old schema
$triggers = "SELECT trigger_name, action_timing, event_manipulation, event_object_table, created
FROM information_schema.triggers
WHERE trigger_schema = '{$oldDB}'";
$results = mysqli_query($c, $triggers);
// checks if any triggers were returned and recreates them in the new schema
if (mysqli_num_rows($results) > 0) {
while ($row = mysqli_fetch_array($results)) {
$trigger = "SHOW CREATE TRIGGER {$oldDB}.{$row[0]}";
$triggerResults = mysqli_query($c, $trigger);
$triggerRow = mysqli_fetch_array($triggerResults);
mysqli_query($c, str_replace($oldDB, $newDB, $triggerRow[2]));
}
}
// gets all procedures in the old schema
$procedures = "SHOW PROCEDURE STATUS WHERE db = '{$oldDB}'";
$results = mysqli_query($c, $procedures);
// checks if any procedures were returned and recreates them in the new schema
if (mysqli_num_rows($results) > 0) {
while ($row = mysqli_fetch_array($results)) {
$procedure = "SHOW CREATE PROCEDURE {$oldDB}.{$row[1]}";
$procedureResults = mysqli_query($c, $procedure);
$procedureRow = mysqli_fetch_array($procedureResults);
mysqli_query($c, str_replace($oldDB, $newDB, $procedureRow[2]));
}
}
// gets all functions in the old schema
$functions = "SHOW FUNCTION STATUS WHERE db = '{$oldDB}'";
$results = mysqli_query($c, $functions);
// checks if any functions were returned and recreates them in the new schema
if (mysqli_num_rows($results) > 0) {
while ($row = mysqli_fetch_array($results)) {
$function = "SHOW CREATE FUNCTION {$oldDB}.{$row[1]}";
$functionResults = mysqli_query($c, $function);
$functionRow = mysqli_fetch_array($functionResults);
mysqli_query($c, str_replace($oldDB, $newDB, $functionRow[2]));
}
}
// selects the old schema (a must for copying events)
mysqli_select_db($c, $oldDB);
// gets all events in the old schema
$query = "SHOW EVENTS
WHERE db = '{$oldDB}';";
$results = mysqli_query($c, $query);
// selects the new schema again
mysqli_select_db($c, $newDB);
// checks if any events were returned and recreates them in the new schema
if (mysqli_num_rows($results) > 0) {
while ($row = mysqli_fetch_array($results)) {
$event = "SHOW CREATE EVENT {$oldDB}.{$row[1]}";
$eventResults = mysqli_query($c, $event);
$eventRow = mysqli_fetch_array($eventResults);
mysqli_query($c, str_replace($oldDB, $newDB, $eventRow[3]));
}
}
}
mysqldump없이 데이터베이스 테이블을 복제하는 가장 좋은 방법 :
- 새 데이터베이스를 작성하십시오.
쿼리를 사용하여 복제 쿼리를 만듭니다.
SET @NewSchema = 'your_new_db'; SET @OldSchema = 'your_exists_db'; SELECT CONCAT('CREATE TABLE ',@NewSchema,'.',table_name, ' LIKE ', TABLE_SCHEMA ,'.',table_name,';INSERT INTO ',@NewSchema,'.',table_name,' SELECT * FROM ', TABLE_SCHEMA ,'.',table_name,';') FROM information_schema.TABLES where TABLE_SCHEMA = @OldSchema AND TABLE_TYPE != 'VIEW';
그 출력을 실행하십시오!
그러나 위의 스크립트는 뷰, 트리거 및 사용자 함수가 아닌 테이블을 빠르게 복제 합니다. 구조를 빨리 mysqldump --no-data --triggers -uroot -ppassword
가져온 다음 insert 문만 복제하는 데 사용할 수 있습니다.
왜 실제 질문입니까? 때문에 mysqldumps의 업로드 못생긴 느린 DB는 기가 바이트를 초과합니다. 그리고 스냅 샷 백업과 같은 DB 파일을 복사하는 것만으로 InnoDB 테이블을 복제 할 수 없습니다.
행을 복제하는 SQL 명령을 작성하십시오.
select @fromdb:="crm";
select @todb:="crmen";
SET group_concat_max_len=100000000;
SELECT GROUP_CONCAT( concat("CREATE TABLE `",@todb,"`.`",table_name,"` LIKE `",@fromdb,"`.`",table_name,"`;\n",
"INSERT INTO `",@todb,"`.`",table_name,"` SELECT * FROM `",@fromdb,"`.`",table_name,"`;")
SEPARATOR '\n\n')
as sqlstatement
FROM information_schema.tables where table_schema=@fromdb and TABLE_TYPE='BASE TABLE';
실제로 PHP에서 정확히 달성하고 싶었지만 여기에 대한 답변은별로 도움이되지 않았으므로 여기에는 MySQLi를 사용하는 매우 간단한 솔루션이 있습니다.
// Database variables
$DB_HOST = 'localhost';
$DB_USER = 'root';
$DB_PASS = '1234';
$DB_SRC = 'existing_db';
$DB_DST = 'newly_created_db';
// MYSQL Connect
$mysqli = new mysqli( $DB_HOST, $DB_USER, $DB_PASS ) or die( $mysqli->error );
// Create destination database
$mysqli->query( "CREATE DATABASE $DB_DST" ) or die( $mysqli->error );
// Iterate through tables of source database
$tables = $mysqli->query( "SHOW TABLES FROM $DB_SRC" ) or die( $mysqli->error );
while( $table = $tables->fetch_array() ): $TABLE = $table[0];
// Copy table and contents in destination database
$mysqli->query( "CREATE TABLE $DB_DST.$TABLE LIKE $DB_SRC.$TABLE" ) or die( $mysqli->error );
$mysqli->query( "INSERT INTO $DB_DST.$TABLE SELECT * FROM $DB_SRC.$TABLE" ) or die( $mysqli->error );
endwhile;
참고 URL : https://stackoverflow.com/questions/25794/copy-duplicate-database-without-using-mysqldump
'development' 카테고리의 다른 글
레일에서 문자열과 텍스트의 차이점은 무엇입니까? (0) | 2020.02.19 |
---|---|
객체가 목록인지 튜플인지 확인하는 방법 (문자열은 아님)? (0) | 2020.02.19 |
테이블을 잠그지 않고 MySQLDump 실행 (0) | 2020.02.19 |
로컬 변경을 무시하면서 힘내? (0) | 2020.02.19 |
파이썬에서 숫자를 어떻게 반올림합니까? (0) | 2020.02.19 |