如何移动mysql数据库最简单&最快的方式?

时间:2012-02-28 21:13:22

标签: php mysql mysqldump

您好我必须将mysql数据库移动到另一台服务器,

接近5 gb

我可以在两台服务器上拥有root访问权限吗?

3 个答案:

答案 0 :(得分:22)

通常运行mysqldump来创建数据库副本和备份,如下所示:

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

使用sftp / ssh将db-name.out文件复制到远程MySQL服务器:

$ scp db-name.out user@remote.box.com:/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

如果您无法直接访问远程mysql服务器(安全方法),请使用ssh:

$ mysqldump db-name | ssh user@remote.box.com mysql db-name

OR

$ mysqldump -u username -p'password' db-name | ssh user@remote.box.com mysql -u username -p'password db-name

您可以使用相同的语法将名为foo的表复制到名为bar的远程数据库(和远程mysql服务器remote.box.com):

$ mysqldump db-name foo | ssh user@remote.box.com mysql bar

OR

$ mysqldump -u user -p'password' db-name foo | ssh user@remote.box.com mysql -u user -p'password' db-name foo

几乎所有命令都可以使用UNIX / Linux下的管道运行。

来自Reference

的更多信息

问候,

答案 1 :(得分:14)

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

[root@server-A]# /etc/init.d/mysqld stop
[root@server-A]# cd /var/lib/mysql/[databasename]
[root@server-A]# scp * user@otherhost:/var/lib/mysql/[databasename]
[root@server-A]# /etc/init.d/mysqld start

重要的是:在复制数据库文件之前,在两台服务器上停止mysqld,确保在目标服务器上启动mysqld之前,目标文件的所有权和权限是正确的。

[root@server-B]# chown mysql:mysql /var/lib/mysql/[databasename]/*
[root@server-B]# chmod 660 /var/lib/mysql/[databasename]/*
[root@server-B]# /etc/init.d/mysqld start

随着时间的推移,压缩的使用将取决于等待压缩/解压缩(类似gzip)的时间是否大于传输未压缩数据所浪费的时间;也就是你的连接速度。

答案 2 :(得分:2)

有关备份MySQL数据库的自动方式:

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

第一步是使用root权限登录本地计算机。一旦进入root shell,就需要使用只读权限创建MySQL用户。为此,请使用以下命令输入MySQL shell:

mysql -uroot -ppassword

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

grant SELECT on *.* TO backupdbuser@localhost IDENTIFIED BY ' backuppassword';
FLUSH PRIVILEGES;

创建MySQL用户后,退出MySQL shell并使用exit退回root shell是安全的。从这里开始,我们需要创建我们想要运行备份命令的脚本,这可以使用BASH轻松完成。这个脚本可以存储在任何地方,因为我们将使用cron作业每晚运行脚本,为了这个例子,我们将脚本放在我们创建的一个名为&#34; backupscripts的新目录中&#34;要创建此目录,请在root shell中使用此命令:

mkdir /backupscripts

我们还需要创建一个目录来本地存储我们的备份。我们将此目录命名为#34; backuplogs。&#34;在root shell发出此命令以创建目录:

mkdir /backuplogs

下一步是使用root凭据登录您的远程计算机并创建一个&#34;备份用户&#34;使用命令:

useradd -c "backup user" -p backuppassword backupuser

为备份创建目录:

mkdir /backuplogs/

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

ifconfig -a

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

最后,退出远程服务器并返回原始主机。

接下来,我们将在我们的主机本地计算机上创建作为我们脚本的文件,而不是远程。我们将使用VIM(如果您是nano或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 backupuser@remotehostip find /backuplogs/  -name 'backup-db-*.tgz' -exec rm {} \;

#copy the current backup directory to the remote server using scp
scp -r /backuplogs/ backupuser@remotehostip:/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 backupuser@remotehostip

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

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

crontab -e

在crontab编辑器中(它将在您的默认文本编辑器中打开),我们将设置我们的脚本每天晚上12:30运行。在编辑器中输入一个新行:

  

30 0 * * * bash /backupscripts/mysqldbbackup.sh

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

/etc/init.d/crond restart