2012-02-28 14 views
6

嗨,我有mysql数据库移动到另一台服务器,如何移动mysql数据库最简单和最快的方式?

这是近5 GB

我可以在两个服务器的root访问权限?

+0

我想这样的问题属于上http://dba.stackexchange.com/我希望移居迁移,但我没有代表:P或可能http://www.Superuser.com但我会怀疑前者,因为它是数据库特定的。 – Jordan 2012-02-28 21:17:33

回答

22

通常你运行的mysqldump创建一个数据库复制和备份如下:使用SFTP/SSH远程MySQL服务器

$ mysqldump -u user -p db-name > db-name.out 

复制DB-name.out文件:

$ scp db-name.out [email protected]:/backup 

还原数据库在远程服务器(通过ssh登录):

$ mysql -u user -p db-name < db-name.out 

OR

$ mysql -u user -p 'password' db-name < db-name.out 

如何将MySQL数据库从一台计算机/服务器复制到另一台计算机/服务器?

简而言之,您可以使用ssh或mysql客户端将数据库从一台计算机/服务器复制到另一台计算机/服务器。

您可以运行在一个通用mysqldump和mysql命令所有上述3个命令(不安全的方法,只使用,如果您使用VPN或信任网络):

$ mysqldump db-name | mysql -h remote.box.com db-name 

使用SSH,如果你不”吨有远程MySQL服务器(安全法)直接访问:

$ mysqldump db-name | ssh [email protected] mysql db-name 

OR

$ mysqldump -u username -p'password' db-name | ssh [email protected] mysql -u username -p'password db-name 

你ç一个只是复制称为酒吧使用相同的语法表名为foo到远程数据库(和远程MySQL服务器remote.box.com):

$ mysqldump db-name foo | ssh [email protected] mysql bar 

OR

$ mysqldump -u user -p'password' db-name foo | ssh [email protected] mysql -u user -p'password' db-name foo 

几乎所有的命令都可以通过下水管运行UNIX/Linux oses。

更多来自Reference

问候,

+3

请确保您在转储中使用扩展插入选项(我认为它可能默认启用,但不是肯定的),否则恢复速度将显着下降。 – 2012-02-28 21:20:50

+2

*从这里取:http://www.cyberciti.biz/tips/howto-copy-mysql-database-remote-server。html – 2013-09-16 22:08:30

13

如果你有根,你可能会发现它更快避免mysqldump。您可以在目标服务器上创建数据库,并直接复制数据库文件。假设user访问目标服务器的mysql目录:

这里
[[email protected]]# /etc/init.d/mysqld stop 
[[email protected]]# cd /var/lib/mysql/[databasename] 
[[email protected]]# scp * [email protected]:/var/lib/mysql/[databasename] 
[[email protected]]# /etc/init.d/mysqld start 

重要的事情是:复制DB文件之前停止这两个服务器上的mysqld,确保文件的所有权和权限在目标正确的启动mysqld前目标服务器。

[[email protected]]# chown mysql:mysql /var/lib/mysql/[databasename]/* 
[[email protected]]# chmod 660 /var/lib/mysql/[databasename]/* 
[[email protected]]# /etc/init.d/mysqld start 

随着时间的推移在这儿你的优先级,压缩的使用将取决于时间是否失去了等待的压缩/解压缩(喜欢的东西gzip)会比浪费传输未压缩数据的时间更大;也就是连接的速度。

+0

这是迄今为止最简单的方法。不知道为什么这不是更高。然后,MySQL服务器就是原件的复印件。我在5分钟内将整个网络服务器克隆到了一台独特的服务器上。 – David 2013-09-27 15:12:13

+0

我做了上述步骤,但我得到“错误1146(42S02):表'sample.user'不存在”,当我尝试打印用户表。任何想法 ?? – Bathakarai 2013-11-06 08:39:08

+0

想法:错误路径下用户表的文件,错误的文件权限或配置不同的服务器。 – Umbrella 2013-11-08 15:48:18

2

对于一个自动化的方式来备份你的MySQL数据库:

的先决条件做任何形式的备份是找到一天的理想的时间来完成任务,而不妨碍运行系统的性能或用户造成干扰。在这个笔记中,必须考虑数据库的大小以及驱动器的I/O速度 - 随着数据库的增长,数据库的规模变得越来越重要(想到的另一个因素是驱动器的数量,因为有一个由于磁头不执行读写操作,数据库不存储的备用驱动器会提高速度。)为了保持这种可读性,我假设数据库具有可管理的大小(100MB),并且工作环境是上午9点至下午5点的工作,没有真正的压力或其他非工作时间系统。

第一步是使用root权限登录到本地计算机。一旦在根shell中,MySQL用户将需要创建具有只读权限。要做到这一点,使用以下命令输入MySQL的外壳:

mysql -uroot -ppassword 

接下来,用户需要具有只读的权限需要进行备份的数据库中创建。在这种情况下,如果稍​​后使用脚本或进程,则不需要将特定数据库分配给用户。要在MySQL外壳创建拥有完全的读取权限的用户,输入以下命令:

grant SELECT on *.* TO [email protected] IDENTIFIED BY ' backuppassword'; 
FLUSH PRIVILEGES; 

随着创建的MySQL用户,就可以安全退出MySQL的外壳,并使用出口回落到root的shell。从这里开始,我们需要创建我们想要运行备份命令的脚本,这很容易使用BASH完成。该脚本可以在任何地方进行存储,因为我们将使用一个cron作业每晚运行脚本,这个例子的目的,我们将放置脚本在新目录中,我们创建了一个名为“backupscripts。”要创建该目录,在root shell中使用这个命令:

mkdir /backupscripts 

我们还需要创建一个目录来存放我们的本地备份。我们将这个目录命名为“backuplogs”。在root shell中发出以下命令来创建目录:

mkdir /backuplogs 

下一个步骤将是登录到远程机器的根证书,并创建一个“备份用户”使用以下命令:

useradd -c "backup user" -p backuppassword backupuser 

为备份创建一个目录:

mkdir /backuplogs/ 

您注销之前,使用命令抓取远程主机的IP地址,以供将来参考:

ifconfig -a 

eth0是有线网络连接的标准接口。注意这个IP_ADDR。

最后,注销远程服务器,并返回到原来的主机。

下一步,我们将创建一个是我们的主机本地机器,而不是在遥控器上我们的脚本文件。我们将使用VIM(如果你是一个纳米或Emacs风扇不记仇我 - 但我不会列出如何使用VIM编辑在这里一个文件,)首先创建文件,并使用mysqldump ,备份你的数据库。我们也将使用scp来创建数据库后,压缩文件以进行存储。将文件读取到STDOUT以满足说明。最后,检查7天以前的文件。删除它们。要做到这一点,你的脚本将是这样的:

vim /backupscripts/mysqldbbackup.sh 

#!/bin/sh 

# create a temporary file for the schema to be stored 
BACKUPDIR = /backuplogs/ 
TMPFILE = tmpout.sql 
CURRTIME = $(date +%Y%m%d).tgz 

#backup your database 
mysqldump -ubackupdbuser -pbackuppassword databasename > $BACKUPDIR$TMPFILE 

#compress this file and store it locally with the current date 
tar -zvcf /backuplogs/backupdb-$CURRTIME $BACKUPDIR$TMPFILE 

#per instructions - cat the contents of the SQL file to STDOUT 
cat $BACKUPDIR$TMPFILE 

#cleanup script 
# remove files older than 7 days old 
find $BACKUPDIR -atime +7 -name 'backup-db-*.tgz' -exec rm {} \; 

#remove the old backupdirectory from the remote server 
ssh [email protected] find /backuplogs/ -name 'backup-db-*.tgz' -exec rm {} \; 

#copy the current backup directory to the remote server using scp 
scp -r /backuplogs/ [email protected]:/backuplogs/ 

################# 
# End script 
################# 

有了这个脚本的地方,我们需要安装SSH密钥,所以,我们不是提示我们每个脚本运行时输入密码。我们将使用SSH-keygen和命令执行此操作:

ssh-keygen -t rsa 

在提示时输入密码 - 这会创建您的私钥。不要分享这个。

你需要分享的是你的公钥,它被存储在文件current_home /的.ssh/id_rsa.pub文件。下一步是将此公钥传输到远程主机。要获得密钥,请使用以下命令:

cat current_home/.ssh/id_rsa.pub 

复制文件中的字符串。接下来使用以下命令进入远程服务器ssh:

ssh [email protected] 

输入您的密码,然后编辑文件/.ssh/authorized_keys。将从id_rsa.pub文件中获取的字符串粘贴到authorized_keys文件中。使用编辑器将更改写入文件,然后退出编辑器。注销远程服务器并通过使用先前的ssh命令尝试再次登录到远程服务器来测试RSA密钥的工作情况。如果没有要求密码,它工作正常。再次注销远程服务器。

我们需要做的最后一件事是建立一个cron作业的用户已注销后,每天晚上运行此。使用crontab,我们将编辑当前用户文件(root)以避免所有权限问题。 *注 - 这可能产生严重的影响,如果有在脚本中包括删除数据,安全漏洞等错误 - 仔细检查所有的工作,并确保你信任你自己的系统,如果这是不可能的,那么备用的用户和应该在当前服务器*上设置权限。要修改当前的crontab,我们将发出命令:

crontab -e 

虽然在crontab编辑器(它会在您的默认文本编辑器打开),我们要设置我们的脚本在运行12每晚:30AM。输入一个新行到编辑器:

30 0 * * *庆典/backupscripts/mysqldbbackup.sh

保存此文件并退出编辑器。为了让你的cronjob正常运行,我们需要重新启动crond服务。要做到这一点,发出命令:

/etc/init.d/crond restart 
相关问题