在不使用mysqldump的情况下复制/复制数据库

蹲街弑〆低调 提交于 2020-02-27 08:02:11

没有本地访问服务器的权限,有没有办法在不使用mysqldump情况下将MySQL数据库(包含内容和不包含内容)复制/克隆到另一个数据库中?

我目前正在使用MySQL 4.0。


#1楼

如果您使用的是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

#2楼

您可以通过运行以下命令来复制没有数据的表:

CREATE TABLE x LIKE y;

(请参阅MySQL CREATE TABLE Docs)

您可以编写一个脚本,从一个数据库获取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暂时关闭索引

EDIT Maatkit也有一些脚本,这些脚本可能对同步数据很有帮助。 可能不会更快,但是您可以在实时数据上运行它们的同步脚本而无需太多锁定。


#3楼

请注意,作为mysql实用程序添加的一部分,有一个mysqldbcopy命令。... https ://dev.mysql.com/doc/mysql-utilities/1.5/en/utils-task-clone-db.html


#4楼

我真的不知道您所说的“本地访问”是什么意思。 但是对于该解决方案,您需要能够通过ssh访问服务器以将文件复制到存储数据库的位置

我无法使用mysqldump,因为我的数据库很大(7Go,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

#5楼

不使用mysqldump克隆数据库表的最佳方法:

  1. 创建一个新的数据库。
  2. 使用查询创建克隆查询:

    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';
  3. 运行该输出!

但是请注意,上面的脚本只是快速克隆表 ,而不是视图,触发器和用户功能:您可以通过mysqldump --no-data --triggers -uroot -ppassword快速获取结构,然后仅用于克隆insert语句。

为什么是实际问题? 因为如果数据库超过2Gb ,则mysqldumps的上载速度会很慢 。 而且,您不能仅通过复制数据库文件(例如快照备份)来克隆InnoDB表。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!