Answers:
我最喜欢的方法是将sqldump命令传递到sql命令。您可以处理所有数据库或特定数据库。因此,例如
mysqldump -uuser -ppassword myDatabase | mysql -hremoteserver -uremoteuser -premoteserverpassword
您可以使用
mysqldump --all-databases -uuser -ppassword | mysql -hremoteserver -uremoteuser -premoteserver
唯一的问题是当数据库太大并且管道崩溃时。在这种情况下,您可以逐表或下面提到的任何其他方法进行处理。
netcat
。
我最近通过以下策略移动了一个30GB的数据库:
~/mysqldata/*
)tar -czvf mysqldata.tar.gz ~/mysqldata
)tar -xzvf mysqldata.tar.gz
)根据MySQL 5.0认证研究指南,第32章32.3.4节,第456,457页描述了二进制可移植性的条件,该条件带来了以下内容:
如果要进行在一台计算机上进行的二进制备份并在具有不同体系结构的另一台计算机上使用二进制备份,则二进制可移植性非常重要。例如,使用二进制备份是将数据库从一台MySQL服务器复制到另一台MySQL服务器的一种方法。
对于MyISAM,二进制可移植性意味着您可以将MyISAM表的文件从一台MySQL服务器直接复制到另一台机器上的另一台,而第二台服务器将能够访问该表。
对于InnoDB,二进制可移植性意味着您可以将表空间文件从一台计算机上的MySQL服务器直接复制到另一台计算机上的另一台服务器,而第二台服务器将能够访问该表空间。默认情况下,服务器管理的所有InnoDB表都存储在表空间中,因此表空间的可移植性取决于所有单个InnoDB表是否可移植。如果一个表都不是可移植的,那么表空间也不是。
如果满足两个条件,则可以将MyISAM表和InnoDB表空间从一台主机二进制移植到另一台主机:
- 两台机器都必须使用二进制补码算术
- 两台计算机都必须使用IEEE浮点格式,否则表必须不包含浮点列(FLOAT或DOUBLE)
实际上,这两个条件几乎没有限制。二进制补码整数算法和IEEE浮点格式是现代硬件上的标准。InnoDB二进制可移植性的第三个条件是,您应该对表和数据库使用小写名称。这是因为InnoDB在Windows上以小写形式在内部(在其数据字典中)存储这些名称。使用小写名称可以在Windows和Unix之间实现二进制可移植性,以强制使用小写名称,您可以在选项文件中放置以下几行:
[mysqld]
lower_case_table_names=1
如果将InnoDB配置为使用按表的表空间,则二进制可移植性的条件将扩展为也包括InnoDB表的.ibd文件。(共享表空间的条件仍然适用,因为它包含存储有关所有InnoDB表信息的数据字典。)
如果不满足二进制可移植性的条件,则可以通过使用某种文本格式(例如,使用mysqldump)转储MyISAM或InnoDB表将它们从一台服务器复制到另一台服务器,然后将它们重新加载到目标服务器中。
基于存储引擎的两种主要方法可以移动单个表。
对于给定的示例,我们将假设以下内容:
MyISAM表
如果mydb.mytable使用MyISAM存储引擎,则该表实际上将表现为三个单独的文件
.frm包含表结构
.MYD包含表数据
.MYI包含表索引页
从mysql的逻辑观点来看,这些文件相互依赖地用来表示表。由于这些文件没有附加的逻辑关联,因此将表从一个DB服务器迁移到另一个。您甚至可以从Windows服务器到Linux服务器或MacOS。当然,您可以关闭mysql并复制3个表文件。您可以运行以下命令:
LOCK TABLES mydb.mytable READ;
SELECT SLEEP(86400);
UNLOCK TABLES;
在一个ssh会话中将表保持为只读状态并保持锁24小时。一秒钟后,在另一个ssh会话中执行复制。然后用24小时锁定终止mysql会话。您无需等待24小时。
InnoDB表
根据认证书中的上述引用,有许多因素决定着如何备份特定的InnoDB表。为了简单,清楚和简洁起见,只需使用--single-transaction参数对所需表执行mysqldump,即可获得表的最佳时间点转储。如果您只想要一张表,则无需使用InnoDB语义。您可以将该转储文件重新加载到您选择的任何MySQL服务器上。
由于此处合并了两个问题(jcolebrand):编辑
如果您不愿忍受数据库性能缓慢的问题,那么即使mysql仍在ServerA上运行,也可以执行从旧服务器(ServerA)到新服务器(ServerB)的一系列rsync。
步骤01)在ServerB上安装ServerA具有的相同版本的mysql
步骤02)在ServerA上,SET GLOBAL innodb_max_dirty_pages_pct = 0;
从mysql 运行大约10分钟(这将从InnoDB缓冲池中清除脏页。它还有助于更快地关闭mysql)如果您的数据库全部是MyISAM,则可以跳过此步骤。
步骤03) rsync --archive --verbose --stats --partial --progress --human-readable ServerA:/var/lib/mysql ServerB:/var/lib/mysql
步骤04)重复步骤03,直到rsync花费不到1分钟
步骤05)service mysql stop
在ServerA上
步骤06)再执行一次rsync
步骤07) scp ServerA:/etc/my.cnf ServerB:/etc/
service mysql start
ServerB上的步骤08)
service mysql start
在ServerA上执行步骤08)(可选)
试试看 !!!
警告
您可以创建一个复制从属。只需记住在主服务器/etc/my.cnf中明确设置了server-id,在从属服务器/etc/my.cnf中明确设置了server-id的编号
如果您要移动整个数据库架构,甚至不需要mysqldump,并且愿意停止第一个数据库(因此在传输时保持一致)
我不记得,如果mysqldump的处理用户和权限,或者仅仅是数据......但即使是这样,这是方式比做转储和运行速度更快。仅当需要转储mysql数据库然后将其重新插入其他RDBMS,需要更改存储选项(innodb与myisam),或者如果要更改mysql的主要版本时,才使用该命令。我认为我已经在4到5之间完成了此操作)
--all-databases
转储mysql模式。在下一台机器上启动mysql会弹出权限,前提是您已将数据文件夹转移到具有相同主要MySQL版本的另一台机器上。(MySQL 5.5.x至MySQL 5.5.x,MySQL 5.1.x至MySQL 5.1.x,MySQL 5.0.x至MySQL 5.0.x)
mysqldump
处理用户和权限,因为它们存储在mysql
架构中。
如果只想移动特定的表,请尝试:
mysqldump -u username -ppassword databasename tablename > databasename.tablename.sql
您可以在同一命令中在上面指定更多表名。命令完成后,将databasename.tablename.sql文件移动到另一台服务器,然后使用以下命令进行还原:
mysql -u username -ppassword databasename < databasename.tablename.sql
请注意,使用mysqldump程序创建了反向.sql文件,并且还原直接在mysql中完成。
您将需要停机。这将需要一段时间,具体取决于您的网络速度。我假设您在Linux / Unix上运行MySQL。这是我使用的过程:
然后照常进行设置本地MySQL。
*注意:您也可以将-c参数与rsync一起使用,以将校验和添加到传输中,但是根据CPU速度的不同,这会很麻烦。
我可以确认DTest的方法也可以在ubuntu和osx之间进行复制。
要复制所有数据库而不必进行任何转储或类似操作:
确保您拥有干净的mysql mysql(安装了从mysql http://cdn.mysql.com/Downloads/MySQL-5.1/mysql-5.1.63-osx10.6-x86_64.dmg下载的dmg ),该文件(VERY重要)从未运行过。
从Mac上/ usr / local / mysql / data /目录顶部的ubuntu计算机复制/ var / lib / mysql /文件夹目录。要访问ubuntu机器上的get文件夹,我必须使用sudo即:
sudo cp /var/lib/mysql /home/foouser/mysql_data_folder
sudo chown -R foouser /home/foouser/mysql_data_folder
我使用scp复制了该文件夹。
在开始之前,请在Mac上获取mysql文件夹的副本,以确保您不会弄乱任何内容。
复制文件夹后,在mac机上执行以下操作:
sudo chown -R _mysql /usr/local/mysql/data/
sudo chgrp -R wheel /usr/local/mysql/data/
sudo chmod -R g+rx /usr/local/mysql/data/
首次启动mysql服务器(从“系统偏好设置”->“ mysql”下的“偏好设置”窗格中)。现在应该正确设置所有用户和数据库。
这适用于ubuntu 64位11.10上的mysql 5.1.61和osx lion(macbook pro)上的mysql 5.1.63。
我认为所有较早的答案都可以正常工作,但是并不能真正解决在传输过程中设置数据库名称的问题。
这就是我刚刚使用bash的方式:
您最好使用而rsync
不是scp
,如果经常这样做,最好不要压缩文件。
在我的源服务器上:
me@web:~$ d=members
me@web:~$ mysqldump $d | gzip > $d.sql.gz
me@web:~$ scp -i .ssh/yourkeynamehere $d.sql.gz $sbox:$d.sql.gz
在我的目标服务器上:
me@sandbox:~$ d1=members
me@sandbox:~$ d2=members_sb
me@sandbox:~$ mysqladmin create $d2
me@sandbox:~$ cat $d1.sql.gz | gunzip | mysql $d2
在任一台机器上查看进度:
me@sandbox:~$ ls *.gz
me@sandbox:~$ cat $d.sql.gz | gunzip | less
所有这些都假定您在两台计算机的主目录中都有MySQL配置文件,并设置了权限:
$ echo "
[client]
user=drupal6
password=metoknow
host=ord-mysql-001-sn.bananas.com
[mysql]
database=nz_drupal" > .my.cnf
$ chmod 0600 ~/.my.cnf
您是否将其移动到另一个mysql服务器数据库?如果使用,请对其进行导出
# mysqldump -u username -ppassword database_name > FILE.sql
也许这是一种更好的方法:
版本1:数据文件复制(仅MYISAM)
ssh server1
service mysql stop
cd $mysql-data-dir
rsync -avz dirs-or-files server2:$mysql-data-dir
service mysql start
ssh server2服务重启mysql
- 如果您的数据库文件是只读的,则可以跳过停止服务器的操作。
版本2:mysqldump
在现代Xeon或Opteron处理器上安装pigz-尤其是当您具有2个或更多CPU时,它比gzip快得多。
ssh server1
mysqldump ... | pigz > backup-YYMDD.sql.gz
rsync backup-YYMDD.sql.gz server:location
ssh server2
pigz -dc location/backup-YYMDD.sql.gz | mysql ..
版本3:主/从+ mysqldump /文件复制
In HA environment you should use the following trick:
setup slave server & do all backups from it
before backups - do "slave stop";
then do version 1 or version 2
脚本:
touch full.start
mysqladmin -h slave-db stop-slave
echo "show slave status \G" | mysql -h slave-db > FULL/comfi-$NOW.master-position
/usr/bin/mysqldump -h slave-db --default-character-set=utf8 -A --opt --skip-lock-tables | pigz > "FULL/XXXX-$NOW.sql.gz"
mysqladmin -h slave-db start-slave
touch full.end
ln -fs "FULL/XXXX-$NOW.sql.gz" FULL.sql.gz
PS:
复制小表使用:
ssh server1 mysqldump模式表 ssh server2 mysql模式