当前位置: 首页 > Linux

MySQL数据库入门:备份数据库

时间:2023-04-06 23:28:06 Linux

接上次:MySQL数据库入门多实例配置说到数据,大家都会很紧张。数据有很多种,但是总结起来,数据很重要,很重要,所以,日常的数据备份工作就成了运维工作的重点……首先我们来看一下数据中的数据数据库mysql>select*fromtest;+-----+------+|编号|名字|+-----+-----+|1|1||11|文字||21|美国广播公司||9|bcd||111|1||441|文字||41|美国广播公司||999|bcd|+-----+-----+8组中的行(0.00秒)1。单库备份[root@centos6~]#mysqldump-uroot-ptest>/download/testbak_$(date+%F).sql输入密码:[root@centos6~]#ll/download/total2-rw-r--r--。1rootroot1888Dec1220:34testbak_2016-12-12.sql看看这个备份文件里有什么[root@centos6~]#egrep-v"^--|\*|^$"/download/testbak_2016-12-12.sqlDROPTABLEIFEXISTS`test`;CREATETABLE`test`(`id`int(4)NOTNULL,`name`char(20)NOTNULL)ENGINE=MyISAMDEFAULTCHARSET=latin1;LOCKTABLES`test`写;INSERTINTO`test`VALUES(1,'1'),(11,'text'),(21,'abc'),(9,'bcd'),(111,'1'),(441,'文本'),(41,'abc'),(999,'bcd');解锁表格;从上面的文件内容,你可以可以看出,本次备份的实际过程是备份创建数据库、创建表、插入数据的sql语句。也可以说是导出sql语句-B参数[root@centos6~]#mysqldump-uroot-p-Btest>/download/testbak_$(date+%F)_b.sql输入密码:[root@centos6~]#egrep-v"^--|^$"/download/testbak_2016-12-12_b.sql/*!40101SET@OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT*/;/*!40101SET@OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS*/;/*!40101SET@OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION*/;/*!40101SET8*/f*!40103SET@OLD_TIME_ZONE=@@TIME_ZONE*/;/*!40103SETTIME_ZONE='+00:00'*/;/*!40014SET@OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS,UNIQUE_CHECKS=0*/;/*!40014SET@OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS,FOREIGN_KEY_CHECKS=0*/;/*!40101SET@OLD_SQL_MODE=@@SQL_MODE,SQL_MODE='NO_AUTO_VALUE_ON_ZERO'*/;/*!40111SET@NOOLD_SQL_NOTES=@SQL/;CREATEDATABASE/*!32312IFNOTEXISTS*/`test`/*!40100DEFAULTCHARACTERSETlatin1*/;USE`test`;DROPTABLEIFEXISTS`test`;/*!40101SET@saved_cs_client=@@character_set_client*/;/*!40101SETcharacter_set_client=utf8*/;CREATETABLE`test`(`id`int(4)NOTNULL,`name`char(20)NOTNULL)ENGINE=MyISAMDEFAULTCHARSET=latin1;/*!40101SETcharacter_set_client=@saved_cs_client*/;LOCKTABLES`test`WRITE;/*!40000ALTERTABLE`test`DISABLEKEYS*/;INSERTINTO`test`VALUES(1,'1'),(11,'文本'),(21,'abc'),(9,'bcd'),(111,'1'),(441,'文本'),(41,'abc'),(999,'bcd');/*!40000ALTERTABLE`test`ENABLEKEYS*/;UNLOCKTABLES;/*!40103SETTIME_ZONE=@OLD_TIME_ZONE*/;/*!40101SETSQL_MODE=@OLD_SQL_MODE*/;/*!40014设置forefer_key_checks=@old_foreign_key_checks*/;/*!40014设置unique_checks=@old_unique_checks*/;/*!40101设置prinne_set_client=@old_character_character_sette_set_set_set_set_client*/;/;/*!40101setpartin_set_set_sets!COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION*/;/*!40111SETSQL_NOTES=@OLD_SQL_NOTES*/;-B参数的作用一目了然,就是当我们的数据库丢失的时候,我们可以直接使用这个备份文件来恢复,不需要重建数据库,创建一个表,然后进行数据恢复操作2.压缩备份有时候,数据库中的数据比较大,可能会压缩备份,以节省备份时间和磁盘空间。[root@centos6~]#mysqldump-uroot-p-Btest|gzip>/download/testbak_$(date+%F).sql.gz输入密码:[root@centos6~]#ll/download/testbak_2016-12-12.sql.gz-rw-r--r--。1rootroot753Dec1220:49/download/testbak_2016-12-12.sql.gz[root@centos6~]#ll/download/total14-rw-r--r--.1根根2027年12月12日20:41testbak_2016-12-12_b.sql-rw-r--r--。1根根1888年12月12日20:34testbak_2016-12-12.sql-rw-r--r--。1rootroot753Dec1220:49testbak_2016-12-12.sql.gz也可以同时看到压缩后的效果3.多数据库备份[root@centos6~]#mysqldump-uroot-p-Btestmysql|gzip>/download/testbak_$(date+%F).sql01.gzEnterpassword:--Warning:跳过表mysql.event的数据。明确指定--events选项。[root@centos6~]#ll/download/testbak_2016-12-12.sql01.gz-rw-r--r--。1rootroot152696Dec1220:52/download/testbak_2016-12-12.sql01.gz这里有警告信息,你可以在忽略备份的时候加上参数。备份语句如下[root@centos6~]#mysqldump-uroot-p-B--eventstestmysql|gzip>/download/testbak_$(date+%F).sql02.gz输入密码:[root@centos6~]#ll/download/testbak_2016-12-12.sql02.gz-rw-r--r--。1rootroot152749Dec1220:54/download/testbak_2016-12-12.sql02.gz这样不会有警告信息但是这种多库备份在一起,就会有问题。如果只有一个数据库有问题,单库恢复就不容易了。因此备份方式并不常用,不符合实际需要。因此,多库备份需要多个单库备份。[root@centos6~]#mysqldump-uroot-p-Btest|gzip>/download/testbackup_$(date+%F).sql.gz输入密码:[root@centos6~]#mysqldump-uroot-p-B--eventsmysql|gzip>/download/mysqlbak_$(date+%F).sql.gz输入密码:[root@centos6~]#ll/download/total80-rw-r--r--。1rootroot152608Dec1220:58mysqlbak_2016-12-12.sql.gz-rw-r--r--。1rootroot754Dec1220:58testbackup_2016-12-12.sql.gz-rw-r--r--。1根根2027年12月12日20:41testbak_2016-12-12_b.sql-rw-r--r--。1根根1888年12月12日20:34testbak_2016-12-12.sql-rw-r--r--。1rootroot152696Dec1220:52testbak_2016-12-12.sql01.gz-rw-r--r--。1rootroot152749Dec1220:54testbak_2016-12-12.sql02.gz-rw-r--r--。1rootroot753Dec1220:49testbak_2016-12-12.sql.gz4、单表备份分库备份是为了恢复数据库时方便操作,但是也面临问题,如果是在某个数据库其中一张表损坏,但没有全库进行恢复,所以在实际生产中,一般采用分库分表的方式进行备份,这样数据也备份了,而且在操作过程中也很方便recovery[root@centos6~]#mysqldump-uroot-p-Btesttest>/download/test_testbak_$(date+%F).sql输入密码:[root@centos6~]#egrep-v"#|^$|\*"/download/test_testbak_2016-12-12.sql--MySQL转储10.13Distrib5.5.52,适用于linux2.6(x86_64)----主机:localhost数据库:test----------------------------------------------------------服务器版本5.5.53-log----当前数据库:`test`--USE`test`;----表`test`的表结构--如果存在`test`则删除表;CREATETABLE`test`(`id`int(4)NOTNULL,`name`char(20)NOTNULL)ENGINE=MyISAMDEFAULTCHARSET=latin1;----为表`test`转储数据--LOCKTABLES`测试`写入;插入INTO`test`VALUES(1,'1'),(11,'text'),(21,'abc'),(9,'bcd'),(111,'1'),(441,'text'),(41,'abc'),(999,'bcd');UNLOCKTABLES;----当前数据库:`test`--使用`test`;----表`test`的表结构--DROPTABLEIFEXISTS`test`;CREATETABLE`test`(`id`int(4)NOTNULL,`name`char(20)NOTNULL)ENGINE=MyISAMDEFAULTCHARSET=latin1;----转储数据对于表`test`--LOCKTABLES`test`WRITE;INSERTINTO`test`VALUES(1,'1'),(11,'text'),(21,'abc'),(9,'bcd'),(111,'1'),(441,'text'),(41,'abc'),(999,'bcd');UNLOCKTABLES;--dumpcompletedon2016-12-1221:13:16所以分表备份和分表一样数据库备份。只需要进行多次单表备份操作,但肯定有朋友会问。如果一个库有几千张表,几万张表,这个备份应该准备到猴年吧????,数据量比较大的备份可以使用专业的备份工具。如果数据量不大或者表不多,可以将备份操作写成脚本,放入定时任务中,定时执行。只需要检查是否备份成功就可以分享给农民工了,实际生产环境中的简单备份脚本,仅供参考[root@centos6scripts]#vibak.sh#!/bin/sh###########################################这个脚本由root创建mingongge#create于2016-11-11#########################################ip=`grep'IPADDR'/etc/sysconfig/network-scripts/ifcfg-eth0|awk-F"="'{print$2}'`#定义服务器IP变量BAKDIR=/backup#定义备份路径[!-d$BAKDIR/${ip}]&&mkdir-p$BAKDIR/${ip}#判断这个路径不存在,创建一个,方便查看DB_PWD="mingongge"DB_USER="root"MYSQL="/application/mysql/bin/mysql"MYSQL_DUMP="/application/mysql/bin/mysqldump"DATA=`date+%F`####测试数据库的bak数据####DB_NAME=`$MYSQL-u$DB_USER-p$DB_PWD-e"showdatabases;"|sed'1,5d'`#Definedatabasevariablefornamein$DB_NAME#for循环语句获取数据库名do$MYSQL_DUMP-u$DB_USER-p$DB_PWD-B${name}|gzip>$BAKDIR/${ip}/${name}_$DATA.sql.gz#完整数据库备份[!-d$BAKDIR/${ip}/${name}]&&mkdir-p$BAKDIR/${ip}/${name}#判断这个路径,为了区分`中tablename是哪个库的备份文件$MYSQL-u$DB_USER-p$DB_PWD-e"showtablesfrom${name};"|sed'1d'`#forloopstatement取表名做$MYSQL_DUMP-u$DB_USER-p$DB_PWD${name}${tablename}|gzip>$BAKDIR/${ip}/${name}/${tablename}_$DATA.sql.gz#分表备份doneone执行结果如下[root@ranzhioa~]#tree/backup//backup/10.1xx.1xx.1xx#服务器IPxxxxxxx#其实就是库名cash_balance_2016-12-15.sql.gzcash_depositor_2016-12-15.sql.gzcash_trade_2016-12-15.sql.gzcrm_customer_2016-12-15.sql.gzcrm_delivery_2016-12-15.sql.gzcrm_order_2016-1.sql.gzcrm_orderAction_2016-12-15.sql.gzcrm_orderField_2016-12-15.sql.gzcrm_plan_2016-12-15.sql.gz更多Mysql相关技术文章,请继续关注民工技术之路。如果需要关注更多其他技术文章,也可以关注米公的个人微信公众号:米公的技术之路,关注米公的技术之路微信公众号对话回复关键字:1024即可获得最新技术干货:包括系统运维、数据库、redis、MogoDB、电子书、Java基础课程、Java实战项目、架构师综合教程、架构师实战项目、大数据、Docker容器、ELKStack、机器学习、BAT面试精讲视频等。