数据备份与恢复
问题
本案例要求熟悉MySQL的备份与恢复,完成以下任务操作:
1)使用mysqldump备份数据库
2)使用mysql 恢复数据库
步骤
实现此案例需要按照如下步骤进行。
步骤一:使用mysqldump进行逻辑备份
1)备份MySQL服务器上的所有库
将所有的库备份为mysql-all.sql文件:
[root@dbsvr1 ~]# mysqldump -u root -p --all-databases > /root/alldb.sql
Enter password: //验证口令
[root@dbsvr1 mysql]# file /root/alldb.sql //确认备份文件类型
/root/alldb.sql: UTF-8 Unicode English text, with very long lines
查看备份文件alldb.sql的部分内容:
[root@dbsvr1 ~]# grep -vE '^/|^-|^$' /root/alldb.sql | head -15
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mydb` /*!40100 DEFAULT CHARACTER SET latin1 */;
USE `mydb`;
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysql` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `mysql`;
DROP TABLE IF EXISTS `columns_priv`;
CREATE TABLE `columns_priv` (
`Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',
`Db` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
`User` char(16) COLLATE utf8_bin NOT NULL DEFAULT '',
`Table_name` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
`Column_name` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
`Timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`Column_priv` set('Select','Insert','Update','References') CHARACTER SET utf8 NOT NULL DEFAULT '',
PRIMARY KEY (`Host`,`Db`,`User`,`Table_name`,`Column_name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Column privileges';
.. ..
注意:若数据库都使用MyISAM存储引擎,可以采用冷备份的方式,直接复制对应的数据库目录即可;恢复时重新复制回来就行。
2)只备份指定的某一个库
将userdb库备份为userdb.sql文件:
[root@dbsvr1 ~]# mysqldump -u root -p userdb > userdb.sql
Enter password: //验证口令
查看备份文件userdb.sql的部分内容:
[root@dbsvr1 ~]# grep -vE '^/|^-|^$' /root/userdb.sql
DROP TABLE IF EXISTS `userlist`;
CREATE TABLE `userlist` (
`sn` int(4) NOT NULL AUTO_INCREMENT,
`username` varchar(24) NOT NULL,
`password` varchar(48) DEFAULT 'x',
`uid` int(5) NOT NULL,
`gid` int(5) NOT NULL,
`fullname` varchar(48) DEFAULT NULL,
`homedir` varchar(64) NOT NULL,
`shell` varchar(24) NOT NULL,
) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8;
LOCK TABLES `userlist` WRITE;
.. ..
3)同时备份指定的多个库
同时备份mysql、test、userdb库,保存为mysql+test+userdb.sql文件:
[root@dbsvr1 ~]# mysqldump -u root -p -B mysql test userdb > mysql+test+userdb.sql
Enter password: //验证口令
查看备份文件userdb.sql的部分内容:
[root@dbsvr1 ~]# grep '^CREATE DATA' /root/mysql+test+userdb.sql
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysql` /*!40100 DEFAULT CHARACTER SET utf8 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET utf8 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `userdb` /*!40100 DEFAULT CHARACTER SET utf8 */;
步骤二:使用mysql命令从备份中恢复数据库、表
以恢复userdb库为例,可参考下列操作。通常不建议直接覆盖旧库,而是采用建立新库并导入逻辑备份的方式执行恢复,待新库正常后即可废弃或删除旧库。
1)创建名为userdb2的新库
mysql> CREATE DATABASE userdb2;
Query OK, 1 row affected (0.00 sec)
2)导入备份文件,在新库中重建表及数据
[root@dbsvr1 ~]# mysql -u root -p userdb2 < /root/userdb.sql
Enter password: //验证口令
3)确认新库正常,启用新库
mysql> USE userdb2; //切换到新库
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> SELECT sn,username,uid,gid,homedir //查询数据,确认可用
-> FROM userlist LIMIT 10;
+----+---------------+-----+-----+------------------------+
| sn | username | uid | gid | homedir |
+----+---------------+-----+-----+------------------------+
| 1 | abrt | 173 | 173 | /etc/abrt |
| 2 | adm | 3 | 4 | /var/adm |
| 3 | apache | 48 | 48 | /var/www |
| 4 | avahi-autoipd | 170 | 170 | /var/lib/avahi-autoipd |
| 5 | bin | 1 | 1 | /bin |
| 6 | daemon | 2 | 2 | /sbin |
| 7 | dbus | 81 | 81 | / |
| 8 | ftp | 14 | 50 | /var/ftp |
| 9 | games | 12 | 100 | /usr/games |
| 10 | gdm | 42 | 42 | /var/lib/gdm |
+----+---------------+-----+-----+------------------------+
10 rows in set (0.00 sec)
4)废弃或删除旧库
mysql> DROP DATABASE userdb;
Query OK, 2 rows affected (0.09 sec)