最近在学习mysql,在做相关练习中遇到了一些问题,以下是本人对所遇到的问题提出的解决办法,晒出来希望能对大家有所帮助,有不足之处望各位老铁给予斧正~
数据的备份和还原可以借助mysqldump语句和mysqlbinlog语句,以下主要对这两种方法进行哔哔~
我的开发环境:mysql5.7.17
mysqldump:
mysqldump是mysql用于转存储数据库的实用语句块,可在指定位置生成.sql文件,sql文件里面存放了数据库中各Table的创建语句和插值语句等等,当然有些.sql文件里的语句并不是那么直观,比如通过mysqlbinlog生成的.sql文件,后面会进行讲解~
mysqldump 备份指定数据库:
mysqldump -u root -pdatabase_name > E:/filename.sql
database_name 是你想备份的数据库名称,filename是你保存的.sql文件的文件名(尽量不使用中文,此时选择的是E盘的根目录)
例如:将数据库testdb备份到 E:/backup.sql
咦?为什么报错?
原因是 mysqldump 语句是这样用滴:
exit 出 mysql 在cmd下直接键入mysqldump -u root -p testdb > E:/backup.sql语句,切记,此时末尾不加分号!回车后输入 root 密码(也就是进入mysql的密码),若不提示错误,便说明备份完成!
下面我们来看看备份的sql文件内容是什么样子的:我是用Notepad打开的,sql文件也可以用记事本打开的~
当我们再调用该sql文件时,mysql便可借助其中的数据库信息将数据库还原进mysql,用法如下:
mysql -u root -p database_name < E:/filename.sql
同样注意的是该语句在cmd下键入,而非mysql服务中!还有一点是此时的database_name是mysql中已存在的数据库,即该语句不能生成新的数据库!不妨试上一试,我先drop掉数据库testdb:不负众望,它报错了~哈哈! 错误是testdb数据库未知,因为之前我们已近drop掉它了!
下面我将目标数据库改为mysql(mysql服务自带的数据库),嘿嘿,顺利通过~
之后可以在数据库mysql中输入:show tables;便会发现名为chinesetest的表~select * from chinesetest;便会发现表里的信息和之前testdb中的一木一样!神奇的mysql~
常用的mysqldump语句还有:
mysqldump -u root -pdatabase_name table1 table2 ... > E:/filename.sql
这是选择性的备份database_name数据库中的 table1,table2表...
网上还有好多关于mysqldump的大神博客,老铁们想深入学习可以去看看哈,有好的文章老铁们可以留言给我啊,共同学习共同进步,~
mysqlbinlog:
binlog是二进制日志,简单的理解就是将数据库中的数据以二进制的形式记录下来,默认形式是hostname.00000x(x=1,2,3...)。此外,mysqlbinlog生成的备份文件是动态备份!mysqlbinlog生成备份文件后,我们再对database进行更改,但是此次更改操作由于发生在mysqldump后不会被记录在.sql文件中,这样就很尴尬了。。。但是,binlog日志会将我们对数据的所有操作都记录下来,它就像是一个工作在后台的监视器,以一定的时间间隔查看我们在此段时间内执行的操作,并将之记录下来~
其实吧,重点是如何开启log_bin,这是最伤的,哎~~
如何开启log_bin? 请见文章: 如何开启log_bin?
利用mysqlbinlog还原数据库:
在确定log_bin打开后,在mysql下输入 show master status;便可查看当前logbin文件的位置戳:
wangbo-bin.000006为logbin的文件,wangbo也就是hostname,position值为716,也就是当前操作完成时位置戳指向716
那么如何借助position来还原操作呢?
假设我们现在向 testdb 数据库下的表chinesetset中插入数据段('游戏','男','2017-4-3'),然后再删除这一段数据,再借助mysqlbinlog恢复到删除之前的状态~
插入数据段:
可见插入新的数据段在位置戳2285到2564之间,现在我们删掉('游戏','男','2017-4-3') :
用mysqlbinlog恢复到删除数据段之前:
mysqlbinlog --start-position = P1 --stop-position=P2 E:/hostname.00000x >E:/filename.sql
mysql -u root -pdatabase_name <E:/filename.sql
P1,P2为E:/hostname.00000x中位置戳的开始点和结束点,该语句就是将P1到P2之间的操作转存为 E:/filename.sql ,注意此时要指明logbin的文件路径。实践走一波:
最后要说的是,mysqlbinlog还有有很多用法,比如 :利用时间戳,利用xid等,敬请期待~