MySQL Server 的日常维护中最重要的一项大概就是数据库的定时备份,而 MySQL 数据库的备份方式有很多但一般来说大致上可概分为二种:
1、Binary Copy (直接复制数据库档案)
2、Dump Database (将数据库输出成为文字档)
一、Binary Copy (直接复制数据库档案)
开门见山的说,非常不建议你这样子做。MySQL 支援许多种不同的 Storage Engine,但并不是每一种 Storage Engine 都是 Binary Portable,意思就是说不是每一种 Storage Engine 都可以让你把数据库档案直接复制到另外一台 MySQL Server,然後还可以正常运作的。MySQL 预设的 MyISAM Storage Engine 是 Binary Portable 的,因此若你的数据库只有使用 MyISAM Storage Engine 的话,那麽你大可以直接复制数据库档案来进行备份(当然还必须考虑到资料的一致性,比方说复制之前先关闭 MySQL Server)。但若您有使用到 InnoDB Storage Engine,那麽你就不能这麽做,因为 InnoDB Storage Engine "不是" Binary Portable,只要 CPU 的浮点运算架构不同,复制过去的资料将无法正常运作。除此之外,你复制起来的 InnoDB 数据库档案(share table space)若是还原到不同版本的 MySQL Server 上,也会有很大的机率无法正常运作。除非你很肯定备份(复制)起来的资料只会使用在 "同一台 Server" 并使用 "同一个版本" 的 MySQL Server,不然请勿使用此方法进行备份。
注:
对於 MyISAM Storage Engine,每个数据库(Database)都是一个独立的目录,而数据库中的资料表则会分别以三个档案储存在该目录中,这三个档案分别是:
FRM: 储存这个资料表的结构
MYD: Row Data,也就是你存在资料表(table)里的资料
MYI: 此资料表的索引
但对於 InnoDB Storage Engine 来说,所有的数据库(Database)与资料表(Table)都是储存在同一个(或同一系列)的档案之中,例如 /var/lib/mysql/ibdata1。
二、Dump Database (将数据库输出成为文字档)
MySQL 在安装时即有提供一系列的客户端程式(Client Program),这些程式其实就是各种功能不同的 Perl Scripts 的集合,其中包括有协助您操控 Server 的 mysqladmin、用来执行 SQL 指令的 mysql、转换 binary log 用的 mysqlbinlog 等等。其中有一样工具是专门让您用来备份数据库的,那就是 mysqldump。
mysqldump 的使用方式十分的简易,其语法为:
mysqldump --lock-all-tables -u root -p 数据库名称 > example.sql
--lock-all-tables:进行备份时将正在备份的数据库里的资料表,全部锁定以确保资料的一致性
-u root:使用 root 帐号进行备份
-p:需要输入密码,如果你的 root 帐号有密码保护,而你又不加这个选项,就会直接 ACCESS DENIED
数据库名称:你要备份的数据库名称
example.sql:这个部份你想取什麽名字都行,总之这里就是备份出来的档案名称
开启备份出来的档案看看,你会发现里面其实是由许多 SQL 指令所组成,而这些 SQL 指令就是用来重建整个数据库用的,因此当您还原数据库的时候其实对 MySQL 来说,只是单纯的重新执行备份档里面所有的 SQL 指令。由於备份出来的档案是单纯的文字档案,因此它是 Binary Portable,你可以将它复制到任何一台 MySQL Server 上然後进行还原。
还原的方式也很简单,只要使用以下的指令即可:
mysql -u root -p 数据库名称 < example.sql
大部份论坛程式都会提供数据库备份机制来协助您备份论坛的数据库,但除非您无法直接掌控伺服器(例如租用虚拟主机)或是你不具有使用 SHELL 执行指令的权限,否则不建议您使用那些第三方程式所提供的功能来备份数据库,不然您有可能会遇到备份出来的东西还原不回去的情况。