版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34193883/article/details/83348291
mysql数据备份(重要)
对于一个网站来说,数据是最重要的,也是无可替代的,服务器宕机可以更换硬件,项目丢失都可以根据之前的需求重写,但是数据丢失对于一个公司来说,是灾难性的,所以下面,主要介绍几种常用的mysql备份方式
数据的备份类型
数据的备份主要分为以下两类
- 完全备份:备份整个数据库
- 部分备份:备份部分数据集,又分为以下两种
- 增量备份:备份上一次备份以后的增量数据,优点:省空间;缺点:还原复杂
- 差异备份:本分上一次完全备份以后变化的数据,缺点:浪费空间;有点:还原简单
mysql的数据备份有以下几种
- 热备份:数据库进行备份时,读写不受影响
- 温备份:数据库进行备份时,可读不可写
- 冷备份:数据库进行备份时,不可读写,数据库也不可访问
在考虑备份方式时,还要考虑到数据库本身的存储引擎
引擎 | 热备 | 温备 | 冷备 |
---|---|---|---|
MyISAM | × | √ | √ |
InnoDB | √ | √ | √ |
数据备份与恢复
一、复制文件进行数据恢复
- 定时复制mysql目录下,data文件夹下相关数据库的文件夹
- 数据丢失后,直接将文件夹还原(不可重装数据库或在新数据库上进行直接复制,可能导致数据无法使用)
二、mysqldump+binlog进行数据恢复
- 定时利用mysqldump备份全表数据
- 定期备份binlog作为增量文件备份
- 数据丢失后,首先利用MySQLdump导出的数据进行恢复,然后将增量数据逐步恢复(恢复时间很长,尤其是表格数据较多时)
三、使用lvm2快照备份(未测试)
-
部署lvm环境
#添加硬盘; 这里我们直接实现SCSI硬盘的热插拔, 首先在虚拟机中添加一块硬盘, 不重启 [root@node1 ~]# ls /dev/sd* #只有以下几块硬盘, 但是我们不重启可以让系统识别新添加的硬盘 /dev/sda /dev/sda1 /dev/sda2 [root@node1 ~]# echo '- - -' > /sys/class/scsi_host/host0/scan [root@node1 ~]# echo '- - -' > /sys/class/scsi_host/host1/scan [root@node1 ~]# echo '- - -' > /sys/class/scsi_host/host2/scan [root@node1 ~]# ls /dev/sd* #看!sdb识别出来了 /dev/sda /dev/sda1 /dev/sda2 /dev/sdb [root@node1 ~]# fdisk /dev/sdb #分区 Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel with disk identifier 0xd353d192. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) WARNING: DOS-compatible mode is deprecated. It's strongly recommended to switch off the mode (command 'c') and change display units to sectors (command 'u'). Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-2610, default 1): Using default value 1 Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): +15G Command (m for help): t Selected partition 1 Hex code (type L to list codes): 8e Changed system type of partition 1 to 8e (Linux LVM) Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. You have new mail in /var/spool/mail/root [root@node1 ~]# partx -a /dev/sdb BLKPG: Device or resource busy error adding partition 1 ##创建逻辑卷 [root@node1 ~]# pvcreate /dev/sdb1 Physical volume "/dev/sdb1" successfully created [root@node1 ~]# vgcreate myvg /dev/sdb1 Volume group "myvg" successfully created [root@node1 ~]# lvcreate -n mydata -L 5G myvg Logical volume "mydata" created. [root@node1 ~]# mkfs.ext4 /dev/mapper/myvg-mydata #格式化 [root@node1 ~]# mkdir /lvm_data [root@node1 ~]# mount /dev/mapper/myvg-mydata /lvm_data #挂载到/lvm_data [root@node1 ~]# vim /etc/my.cnf #修改mysql配置文件的datadir如下 datadir=/lvm_data [root@node1 ~]# service mysqld restart #重启MySQL ####重新导入employees数据库########略过####
-
创建快照卷并备份
mysql> FLUSH TABLES WITH READ LOCK; #锁定所有表 Query OK, 0 rows affected (0.00 sec) [root@node1 lvm_data]# lvcreate -L 1G -n mydata-snap -p r -s /dev/mapper/myvg-mydata #创建快照卷 Logical volume "mydata-snap" created. mysql> UNLOCK TABLES; #解锁所有表 Query OK, 0 rows affected (0.00 sec) [root@node1 lvm_data]# mkdir /lvm_snap #创建文件夹 [root@node1 lvm_data]# mount /dev/myvg/mydata-snap /lvm_snap/ #挂载snap mount: block device /dev/mapper/myvg-mydata--snap is write-protected, mounting read-only [root@node1 lvm_data]# cd /lvm_snap/ [root@node1 lvm_snap]# ls employees ibdata1 ib_logfile0 ib_logfile1 mysql mysql-bin.000001 mysql-bin.000002 mysql-bin.000003 mysql-bin.index test [root@node1 lvm_snap]# tar cf /tmp/mysqlback.tar * #打包文件到/tmp/mysqlback.tar [root@node1 ~]# umount /lvm_snap/ #卸载snap [root@node1 ~]# lvremove myvg mydata-snap #删除snap
-
恢复数据
[root@node1 lvm_snap]# rm -rf /lvm_data/* [root@node1 ~]# service mysqld start #启动MySQL, 如果是编译安装的应该不能启动(需重新初始化), 如果rpm安装则会重新初始化数据库 mysql> SHOW DATABASES; #查看数据库, 数据丢失! +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | test | +--------------------+ 3 rows in set (0.00 sec) [root@node1 ~]# cd /lvm_data/ [root@node1 lvm_data]# rm -rf * #删除所有文件 [root@node1 lvm_data]# tar xf /tmp/mysqlback.tar #解压备份数据库到此文件夹 [root@node1 lvm_data]# ls #查看当前的文件 employees ibdata1 ib_logfile0 ib_logfile1 mysql mysql-bin.000001 mysql-bin.000002 mysql-bin.000003 mysql-bin.index test
三、xtrabackup数据恢复
-
备份数据
[root@node1 ~]# mkdir /extrabackup #创建备份目录 [root@node1 ~]# innobackupex --user=root /extrabackup/ #备份数据 ###################提示complete表示成功********************* [root@node1 ~]# ls /extrabackup/ #看到备份目录 2016-04-27_07-30-48 [root@node1 ~]# innobackupex --apply-log /extrabackup/2016-04-27_07-30-48/ #指定备份文件的目录 #一般情况下下面三行结尾代表成功***************** InnoDB: Starting shutdown... InnoDB: Shutdown completed; log sequence number 369661462 160427 07:40:11 completed OK! [root@node1 ~]# cd /extrabackup/2016-04-27_07-30-48/ [root@node1 2016-04-27_07-30-48]# ls -hl #查看备份文件 total 31M -rw-r----- 1 root root 386 Apr 27 07:30 backup-my.cnf drwx------ 2 root root 4.0K Apr 27 07:30 employees -rw-r----- 1 root root 18M Apr 27 07:40 ibdata1 -rw-r--r-- 1 root root 5.0M Apr 27 07:40 ib_logfile0 -rw-r--r-- 1 root root 5.0M Apr 27 07:40 ib_logfile1 drwx------ 2 root root 4.0K Apr 27 07:30 mysql drwx------ 2 root root 4.0K Apr 27 07:30 performance_schema drwx------ 2 root root 4.0K Apr 27 07:30 test -rw-r----- 1 root root 27 Apr 27 07:30 xtrabackup_binlog_info -rw-r--r-- 1 root root 29 Apr 27 07:40 xtrabackup_binlog_pos_innodb -rw-r----- 1 root root 117 Apr 27 07:40 xtrabackup_checkpoints -rw-r----- 1 root root 470 Apr 27 07:30 xtrabackup_info -rw-r----- 1 root root 2.0M Apr 27 07:40 xtrabackup_logfile
-
恢复数据
[root@node1 ~]# rm -rf /data/* #删除数据文件 ***不用启动数据库也可以还原************* [root@node1 ~]# innobackupex --copy-back /extrabackup/2016-04-27_07-30-48/ #恢复数据, 记清使用方法 #########我们这里是编译安装的mariadb所以需要做一些操作########## [root@node1 data]# killall mysqld [root@node1 ~]# chown -R mysql:mysql ./* [root@node1 ~]# ll /data/ #数据恢复 total 28704 -rw-rw---- 1 mysql mysql 16384 Apr 27 07:43 aria_log.00000001 -rw-rw---- 1 mysql mysql 52 Apr 27 07:43 aria_log_control -rw-rw---- 1 mysql mysql 18874368 Apr 27 07:43 ibdata1 -rw-rw---- 1 mysql mysql 5242880 Apr 27 07:43 ib_logfile0 -rw-rw---- 1 mysql mysql 5242880 Apr 27 07:43 ib_logfile1 -rw-rw---- 1 mysql mysql 264 Apr 27 07:43 mysql-bin.000001 -rw-rw---- 1 mysql mysql 19 Apr 27 07:43 mysql-bin.index -rw-r----- 1 mysql mysql 2166 Apr 27 07:43 node1.anyisalin.com.err [root@node1 data]# service mysqld restart MySQL server PID file could not be found! [FAILED] Starting MySQL.. [ OK ] MariaDB [(none)]> SHOW DATABASES; #查看数据库, 已经恢复 +--------------------+ | Database | +--------------------+ | information_schema | | employees | | mysql | | performance_schema | | test | +--------------------+
-
增量备份
#########创建连两个数据库以供测试##################### MariaDB [(none)]> CREATE DATABASE TEST1; Query OK, 1 row affected (0.00 sec) MariaDB [(none)]> CREATE DATABASE TEST2; Query OK, 1 row affected (0.00 sec) [root@node1 ~]# innobackupex --incremental /extrabackup/ --incremental-basedir=/extrabackup/2016-04-27_07-30-48/ [root@node1 ~]# ls /extrabackup/2016-04-27_07-57-22/ #查看备份文件 total 96 -rw-r----- 1 root root 386 Apr 27 07:57 backup-my.cnf drwx------ 2 root root 4096 Apr 27 07:57 employees -rw-r----- 1 root root 49152 Apr 27 07:57 ibdata1.delta -rw-r----- 1 root root 44 Apr 27 07:57 ibdata1.meta drwx------ 2 root root 4096 Apr 27 07:57 mysql drwx------ 2 root root 4096 Apr 27 07:57 performance_schema drwx------ 2 root root 4096 Apr 27 07:57 test drwx------ 2 root root 4096 Apr 27 07:57 TEST1 drwx------ 2 root root 4096 Apr 27 07:57 TEST2 -rw-r----- 1 root root 21 Apr 27 07:57 xtrabackup_binlog_info -rw-r----- 1 root root 123 Apr 27 07:57 xtrabackup_checkpoints -rw-r----- 1 root root 530 Apr 27 07:57 xtrabackup_info -rw-r----- 1 root root 2560 Apr 27 07:57 xtrabackup_logfile [root@node1 ~]# innobackupex --apply-log --redo-only /extrabackup/2016-04-27_07-30-48/ [root@node1 ~]# innobackupex --apply-log --redo-only /extrabackup/2016-04-27_07-30-48/ --incremental-dir=/extrabackup/2016-04-27_07-5 7-22/
-
恢复数据
[root@node1 ~]# rm -rf /data/* #删除数据 [root@node1 ~]# innobackupex --copy-back /extrabackup/2016-04-27_07-30-48/ #整理增量备份之后可以直接通过全量备份还原 [root@node1 ~]# chown -R mysql.mysql /data/
-
总结
备份方法 | 备份速度 | 恢复速度 | 便捷性 | 功能 | 一般用于 |
---|---|---|---|---|---|
cp | 快 | 快 | 一般、灵活性低 | 很弱 | 少量数据备份 |
mysqldump | 慢 | 慢 | 一般、可无视存储引擎的差异 | 一般 | 中小型数据量的备份 |
lvm2快照 | 快 | 快 | 一般、支持几乎热备、速度快 | 一般 | 中小型数据量的备份 |
xtrabackup | 较快 | 较快 | 实现innodb热备、对存储引擎有要求 | 强大 | 较大规模的备份 |