MySQL备份与恢复之真实环境使用冷备(2)
程序员文章站
2024-02-28 08:02:58
在上一篇文章(mysql备份与恢复之冷备)中,我们提到了冷备。但是有个问题,我们存储的数据文件是保...
在上一篇文章(mysql备份与恢复之冷备)中,我们提到了冷备。但是有个问题,我们存储的数据文件是保存在当前本地磁盘的,如果这个磁盘挂掉,那我们存储的数据不就丢失了,这样备份数据不就功亏一篑,劳而无功。所以真实环境中我们多准备几块磁盘,然后再在这些磁盘上搭建lvm,把mysql的数据目录挂载到lvm上,这样数据就不是存储在当前磁盘上,就可以保证数据的安全性。
示意图
真实环境使用冷备模拟
第一步,需要提前规划好磁盘,这里做模拟,添加两磁盘
第二步,对磁盘进行分区
[root@serv01 ~]# fdisk /dev/sdb [root@serv01 ~]# fdisk /dev/sdc [root@serv01 ~]# ll /dev/sd[bc]1 brw-rw----. 1 root disk 8, 17 sep 10 18:06 /dev/sdb1 brw-rw----. 1 root disk 8, 33 sep 10 18:09 /dev/sdc1
第三步,yum安装lvm2
[root@serv01 ~]# yum install lvm2 -y
第四步,创建物理卷
[root@serv01 ~]# pvcreate /dev/sdb1 /dev/sdc1 physical volume "/dev/sdb1" successfully created physical volume "/dev/sdc1" successfully created
第五步,创建卷组
[root@serv01 ~]# vgcreate data /dev/sdb1 /dev/sdc1 volume group "data" successfully created
第六步,创建逻辑卷
[root@serv01 ~]# lvcreate -l 2g -n mydata data logical volume "mydata" created
第七步,格式化磁盘
[root@serv01 ~]# mkfs.ext4 /dev/data/mydata mke2fs 1.41.12 (17-may-2010) filesystem label= os type: linux block size=4096 (log=2) fragment size=4096 (log=2) stride=0 blocks, stripe width=0 blocks 131072 inodes, 524288 blocks 26214 blocks (5.00%) reserved for the super user first data block=0 maximum filesystem blocks=536870912 16 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912 writing inode tables: done creating journal (16384 blocks): done writing superblocks and filesystem accounting information: done this filesystem will be automatically checked every 28 mounts or 180 days, whichever comes first. use tune2fs -c or -i to override.
第八步,冷备
[root@serv01 ~]# ls /usr/local/mysql/data/ crm ib_logfile0 mysql-bin.000001 mysql-bin.000005 mysql-bin.000009 mysql-bin.000013 mysql-bin.index test game ib_logfile1 mysql-bin.000002 mysql-bin.000006 mysql-bin.000010 mysql-bin.000014 performance_schema hello larrydb mysql-bin.000003 mysql-bin.000007 mysql-bin.000011 mysql-bin.000015 serv01.host.com.err ibdata1 mysql mysql-bin.000004 mysql-bin.000008 mysql-bin.000012 mysql-bin.000016 serv01.host.com.pid [root@serv01 opt]# tar -cvpzf mysql01.tar.gz /usr/local/mysql/data/
第九步,删除数据库文件
[root@serv01 ~]# rm -rf /usr/local/mysql/data/*
第十步,挂载
[root@serv01 ~]# mount /dev/data/mydata /usr/local/mysql/data/ [root@serv01 ~]# df -h filesystem size used avail use% mounted on /dev/sda2 9.7g 2.4g 6.8g 27% / tmpfs 188m 0 188m 0% /dev/shm /dev/sda1 194m 25m 160m 14% /boot /dev/sda5 4.0g 160m 3.7g 5% /opt /dev/sr0 3.4g 3.4g 0 100% /iso /dev/mapper/data-mydata 2.0g 67m 1.9g 4% /usr/local/mysql/data
第十一步,将挂载信息写入配置文件
[root@serv01 opt]# echo "/dev/mapper/data-mydata /usr/local/mysql/data ext4 defaults 1 2" >> /etc/fstab [root@serv01 opt]# tail -n1 /etc/fstab /dev/mapper/data-mydata /usr/local/mysql/data ext4 defaults 1 2
第十二步,停掉数据库
[root@serv01 ~]# /etc/init.d/mysqld stop error! mysql server pid file could not be found! [root@serv01 ~]# ps -ef | grep mysqld root 1055 1 0 18:05 ? 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/data/serv01.host.com.pid mysql 1332 1055 0 18:05 ? 00:00:00 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/usr/local/mysql/data/serv01.host.com.err --pid-file=/usr/local/mysql/data/serv01.host.com.pid --socket=/tmp/mysql.sock --port=3306 root 1885 1490 0 18:18 pts/0 00:00:00 grep mysqld [root@serv01 ~]# pkill -9 mysql [root@serv01 ~]# ps -ef | grep mysqld root 1888 1490 0 18:18 pts/0 00:00:00 grep mysqld [root@serv01 ~]# chown mysql.mysql /usr/local/mysql/data/ -r [root@serv01 opt]# ll /usr/local/mysql/data/ total 0 [root@serv01 opt]# ll /usr/local/mysql/data/ -d drwxr-xr-x. 2 mysql mysql 4096 sep 10 18:17 /usr/local/mysql/data/
第十三步,恢复数据
[root@serv01 opt]# tar -xpvf mysql01.tar.gz
第十四步,启动数据库,登录mysql,然后查看数据是否丢失
[root@serv01 opt]# /etc/init.d/mysqld start starting mysql success! [root@serv01 ~]# mysql welcome to the mysql monitor. commands end with ; or \g. your mysql connection id is 1 server version: 5.5.29-log source distribution copyright (c) 2000, 2012, oracle and/or its affiliates. all rights reserved. oracle is a registered trademark of oracle corporation and/or its affiliates. other names may be trademarks of their respective owners. type 'help;' or '\h' for help. type '\c' to clear the current input statement. mysql> use larrydb; database changed mysql> show tables; +-------------------+ | tables_in_larrydb | +-------------------+ | class | | stu | +-------------------+ 2 rows in set (0.00 sec) mysql> select * from class; +------+--------+ | cid | cname | +------+--------+ | 1 | linux | | 2 | oracle | +------+--------+ 2 rows in set (0.01 sec) mysql> select * from stu; +------+---------+------+ | sid | sname | cid | +------+---------+------+ | 1 | larry01 | 1 | | 2 | larry02 | 2 | +------+---------+------+ 2 rows in set (0.00 sec)
第十五步,使用lvs的快照功能创建快照,快照不需要格式化。
[root@serv01 opt]# lvcreate -l 100m -s -n smydata /dev/data/mydata logical volume "smydata" created
第十六步,挂载
[root@serv01 opt]# mount /dev/data/smydata /mnt [root@serv01 opt]# df -h filesystem size used avail use% mounted on /dev/sda2 9.7g 2.4g 6.8g 27% / tmpfs 188m 0 188m 0% /dev/shm /dev/sda1 194m 25m 160m 14% /boot /dev/sda5 4.0g 161m 3.7g 5% /opt /dev/sr0 3.4g 3.4g 0 100% /iso /dev/mapper/data-mydata 2.0g 98m 1.8g 6% /usr/local/mysql/data /dev/mapper/data-smydata 2.0g 98m 1.8g 6% /mnt
第十七步,模拟数据丢失和验证快照的数据不会受本身数据的影响
[root@serv01 opt]# cd /mnt [root@serv01 mnt]# ls crm ib_logfile1 mysql-bin.000003 mysql-bin.000008 mysql-bin.000013 mysql-bin.index game larrydb mysql-bin.000004 mysql-bin.000009 mysql-bin.000014 performance_schema hello mysql mysql-bin.000005 mysql-bin.000010 mysql-bin.000015 serv01.host.com.err ibdata1 mysql-bin.000001 mysql-bin.000006 mysql-bin.000011 mysql-bin.000016 serv01.host.com.pid ib_logfile0 mysql-bin.000002 mysql-bin.000007 mysql-bin.000012 mysql-bin.000017 test #进入数据目录,创建一个文件 [root@serv01 ~]# cd /usr/local/mysql/data/ [root@serv01 data]# touch aa01.txt #进入快照挂载目录,发现没有这个文件 [root@serv01 mnt]# ls aa01.txt ls: cannot access aa01.txt: no such file or directory
第十八步,备份数据
[root@serv01 mnt]# cd /databackup/ [root@serv01 databackup]# ll total 976 -rw-r--r--. 1 root root 995761 sep 10 17:47 mysql01.tar.gz [root@serv01 databackup]# /etc/init.d/mysqld status success! mysql running (2198) [root@serv01 databackup]# tar -cvzf mysql02.tar.gz /mnt [root@serv01 mnt]# rm -rf /usr/local/mysql/data/* [root@serv01 mnt]# /etc/init.d/mysqld stop error! mysql server pid file could not be found! [root@serv01 mnt]# pkill -9 mysql [root@serv01 mnt]# ps -ef | grep mysqld | grep grep -v [root@serv01 mnt]# cd /usr/local/mysql/data/ [root@serv01 data]# ll total 0
第十九步,恢复数据,启动数据库,登录mysql,然后查看数据是否丢失
[root@serv01 data]# tar -xvf /databackup/mysql02.tar.gz [root@serv01 data]# ls mnt [root@serv01 data]# cd mnt/ [root@serv01 mnt]# mv ./* ../ [root@serv01 mnt]# cd .. [root@serv01 data]# ls crm ib_logfile0 mysql mysql-bin.000004 mysql-bin.000008 mysql-bin.000012 mysql-bin.000016 serv01.host.com.err game ib_logfile1 mysql-bin.000001 mysql-bin.000005 mysql-bin.000009 mysql-bin.000013 mysql-bin.000017 serv01.host.com.pid hello larrydb mysql-bin.000002 mysql-bin.000006 mysql-bin.000010 mysql-bin.000014 mysql-bin.index test ibdata1 mnt mysql-bin.000003 mysql-bin.000007 mysql-bin.000011 mysql-bin.000015 performance_schema [root@serv01 data]# /etc/init.d/mysqld start starting mysql success! [root@serv01 data]# mysql welcome to the mysql monitor. commands end with ; or \g. your mysql connection id is 1 server version: 5.5.29-log source distribution copyright (c) 2000, 2012, oracle and/or its affiliates. all rights reserved. oracle is a registered trademark of oracle corporation and/or its affiliates. other names may be trademarks of their respective owners. type 'help;' or '\h' for help. type '\c' to clear the current input statement. mysql> use larrydb; database changed mysql> select * from class; +------+--------+ | cid | cname | +------+--------+ | 1 | linux | | 2 | oracle | +------+--------+ 2 rows in set (0.00 sec) mysql> select * from stu; +------+---------+------+ | sid | sname | cid | +------+---------+------+ | 1 | larry01 | 1 | | 2 | larry02 | 2 | +------+---------+------+ 2 rows in set (0.00 sec)
本文主要是在真实环境实现冷备份,保证数据的安全性,很有实用价值,有需要的朋友可以收藏起来。
上一篇: 一次MySQL慢查询导致的故障