首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何以最简单最快的方式移动mysql数据库?

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

Stack Overflow用户
提问于 2012-02-29 05:13:22
回答 3查看 23.4K关注 0票数 8

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

差不多有5 gb

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-29 05:15:45

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

代码语言:javascript
运行
复制
$ mysqldump -u user -p db-name > db-name.out

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

代码语言:javascript
运行
复制
$ scp db-name.out user@remote.box.com:/backup

在远程服务器上恢复数据库(通过ssh登录):

代码语言:javascript
运行
复制
$ mysql -u user -p db-name < db-name.out

代码语言:javascript
运行
复制
$ mysql -u user -p 'password' db-name < db-name.out

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

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

您可以使用mysqldump和mysql命令一次性运行上述三个命令(不安全方法,仅当您使用VPN或信任您的网络时使用):

代码语言:javascript
运行
复制
$ mysqldump db-name | mysql -h remote.box.com db-name

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

代码语言:javascript
运行
复制
$ mysqldump db-name | ssh user@remote.box.com mysql db-name

代码语言:javascript
运行
复制
$ mysqldump -u username -p'password' db-name | ssh user@remote.box.com mysql -u username -p'password db-name

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

代码语言:javascript
运行
复制
$ mysqldump db-name foo | ssh user@remote.box.com mysql bar

代码语言:javascript
运行
复制
$ mysqldump -u user -p'password' db-name foo | ssh user@remote.box.com mysql -u user -p'password' db-name foo

在UNIX/Linux操作系统下,几乎所有命令都可以使用管道运行。

来自Reference的更多信息

致以敬意,

票数 22
EN

Stack Overflow用户

发布于 2012-02-29 05:24:33

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

代码语言:javascript
运行
复制
[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

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

代码语言:javascript
运行
复制
[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之类的东西)所浪费的时间是否会大于传输未压缩数据所花费的时间;即,您的连接速度。

票数 16
EN

Stack Overflow用户

发布于 2012-02-29 05:26:35

要自动备份MySQL数据库,请执行以下操作:

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

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

代码语言:javascript
运行
复制
mysql -uroot -ppassword

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

代码语言:javascript
运行
复制
grant SELECT on *.* TO backupdbuser@localhost IDENTIFIED BY ' backuppassword';
FLUSH PRIVILEGES;

创建了MySQL用户后,可以安全地退出MySQL shell并使用exit返回到根shell。从这里开始,我们需要创建我们想要运行备份命令的脚本,这可以使用BASH轻松完成。该脚本可以存储在任何地方,因为我们将使用cron作业每晚运行该脚本。出于本例的考虑,我们将该脚本放在我们创建的名为“backupscripts”的新目录中。要创建此目录,请在根shell中使用以下命令:

代码语言:javascript
运行
复制
mkdir /backupscripts

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

代码语言:javascript
运行
复制
mkdir /backuplogs

下一步是使用root凭据登录到您的远程计算机,并使用以下命令创建一个“备份用户”:

代码语言:javascript
运行
复制
useradd -c "backup user" -p backuppassword backupuser

为备份创建一个目录:

代码语言:javascript
运行
复制
mkdir /backuplogs/

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

代码语言:javascript
运行
复制
ifconfig -a

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

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

接下来,我们将在本地主机上创建脚本文件,而不是在远程机器上。我们将使用VIM (如果你是nano或emacs的粉丝,请不要反对我-但我不会在这里列出如何使用VIM编辑文件)首先创建文件并使用mysqldump备份您的数据库。我们还将使用scp在创建数据库后压缩您的文件以进行存储。将文件读取到STDOUT以满足说明。最后,检查超过7天的文件。去掉它们。为此,您的脚本将如下所示:

代码语言:javascript
运行
复制
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和以下命令完成此操作:

代码语言:javascript
运行
复制
ssh-keygen -t rsa

在提示符处输入密码-这将创建您的私钥。不要分享这一点。

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

代码语言:javascript
运行
复制
cat current_home/.ssh/id_rsa.pub 

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

代码语言:javascript
运行
复制
ssh backupuser@remotehostip

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

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

代码语言:javascript
运行
复制
crontab -e

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

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

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

代码语言:javascript
运行
复制
/etc/init.d/crond restart
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9489799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档