前一段时间因为误操作删除了一张表的几条数据,弄得很尴尬,正好这周有空就折腾了下数据备份的知识,现把mysql的数据备份相关实践和心得总结如下:

一.使用mysqldump命令备份数据库:

备份整个数据库(包括表结构和数据),用法如下

mysqldump -h10.38.14.143 -uroot -prootroot  weixin > weixin.sql

其中 weixin 是数据库名,可以一次备份多个数据库 (用空格隔开),默认保存在当前目录下

这个wexin.sql文件里面主要由四部分组成:数据库及操作系统的信息、表结构、具体的数据(实际上是insert语句)、锁表以及释放表的命令语句

补充:

1.读锁定:本人和其他人只能读取数据库

写锁定:只有本人能进行增删改查,其他人不能进行任何操作

2.有时用mysqldump命令会提示没权限去操作数据库相关的提示语 如 mysqldump: Got error: 1044: Access denied for user 'php'@'10.38.%' to database 'cms_fgw' when using LOCK TABLES

这是因为mysql数据库限制了远程服务器对他的相关操作,请和DBA沟通开放权限(主要是执行下面类似的命令去授权)

grant all privileges  on *.*  to  'root'@'%'  identified by '123456' with grant  option;

flush privileges;

3.如若忘记mysql命令的一些用法可以多多使用?操作,相当于man帮助,这个很有用,如下

4.用mysqldump也可以只备份表结构,用法如下

mysqldump -h10.38.14.143 -uroot -prootroot --no-data --databases weixin cjdaily > /tmp/table_structure.sql

table_structure.sql中的部内容如下

5.可以根据mysqldump命令进行一些扩展写一个备份数据库的shell脚本,如下是根据我们自己的需求写的一个脚本(shell脚本的具体语法就不讲了)

#!/bin/bash

#backup database

if [ $# -ge 1 ] ; then

databaselist=$@

else

databaselist="cjdaily cms_rmrb guangzhou pladaily"

fi

for database in $databaselist

do

if [ ! -e /home/pengyudi/backup_databases/$database ]

then

mkdir -p /home/pengyudi/backup_databases/$database

fi

mysqldump --opt -h10.38.10.5 -uchen -pab#@c-123 $database |gzip > /home/pengyudi/backup_databases/$database/$database$(date +"%Y-%m-%d %H:%M:%S").sql.gz

if [ $? -eq 0 ]

then

echo "$(date +"%Y-%m-%d %H:%M:%S") Database ---$database---  Backup Successfully \r\n"

find /home/pengyudi/backup_databases/$database/ -name $database\* -ctime +1 -exec rm -rf {} \;

else

echo "$(date +"%Y-%m-%d %H:%M:%S") Database  ---$database---  Backup unsuccessfully,please check out the reason\r\n"

fi

done

6.备份某台主机上的所有数据库 mysqldump --opt -h10.38.10.5 -uchenliangliagasd  -pabcdeqasdadfa -1238  --all-databases> test.dump


二.数据的恢复

1.切换到mysql的工作环境
use test;

source /tmp/table_structure.sql ;

2.不切换到mysql环境

/usr/bin/mysql -h192.168.4.47 -um_bbs_test_admin -P3309 -p89603d5a test</tmp/table_structure.sql ;    (注意得指定具体的数据库)


三.使用load导入数据 和select **** from tabelName into outfile 'file_name'的方式导出数据

补充

1.注意保存数据的文件要打引号以及保存数据的文件路径,要特别留意一些细节,如上,确实很容易出错

select * from weixin_data_rmrb into outfile 'weixin_outfile.sql';

2.使用技巧:

当用load命令导入数据时可以通过适当数据提高导入速度,对于MyISAM储存引擎的表

(1)可以通过以下方式快速导入大量数据(disable keys 和enable keys 可以用来打开或关闭非唯一索引的更新,提高导入速度,但是对InnoDB表无效)

alter table weixin_data_rmrb  disable keys

load data infile 'weixin_outfile.sql' into table weixin_data_rmrb

alter table weixin_data_rmrb enable keys

(2)关闭唯一性校验可以提高导入速度

在导入数据前后分别执行 set unique_checks=0(关闭唯一性校验) 和 set unique_checks=1来提高导入速度

对于Innodb表可以使用一下方式提高导入速度:

(1)将导入的数据按照主键的顺序排列,可以提高导入速度,因为Innodb表是按照主键顺序保存的

(2)在导入之前执行set autocommit=0关闭自动提交事物,导入结束后执行set autocommit=1回复自动提交事物


四.使用二进制日志恢复数据


1.开启binlog日志

修改/etc/my.cnf配置文件

vim /etc/my.cnf

在[mysqld]下面添加如下两行用于开启及设置binlog日志的保存路径

log-bin=/home/logs/mysql/mysql-bin #记得要修改权限,不然mysql无法启动;  mysql-bin为日志文件的名称的组成部分(mysql-bin.000001)

binlog_format=mixed

log=/home/logs/mysql/mysql.log

保存退出

chown mysql.mysql /home/logs/mysql -R #修改目录权限

其中mysql-bin.index记录了生成了哪些二进制日志文件

另外跟日志相关的参数:

expire_logs_days = 7 #保留七天的日志

slow-query-log = on #开启慢查询

slow_query_log_file = /home/logs/mysql/slow.log #慢查询日志保存路径

long_query_time = 1 #慢查询的时间,超过一秒的记录下来

log-queries-not-using-indexes = on #记录没用使用到索引的SQL语句

修改配置后重启mysql:service mysqld restart

进入到mysql命令界面查看二进制日志相关信息:

show variables like "%bin%"

2.与binlog日志有关的命令

flush logs: 执行完之后在存放binlog日志的目录下多一个最新的binlog日志文件

show master status 查看最后一个bin日志

reset master 清空所有的binlog日志

通过binlog日志恢复到某一个日志文件的操作命令:

/usr/bin/mysqlbinlog --no-defaults -f  /home/logs/mysql/mysql-bin.000008| mysql -h10.38.14.143 -uroot -prootroot

查看某个binlog日志命令: /usr/bin/mysqlbinlog --no-defaults -f  /home/logs/mysql/mysql-bin.000008

说明:可以根据需要恢复到某一个点的数据,mysqlbinlog后面的主要参数有:

--stop-position="120"

--start-positon="20"

--stop-date="2016-11-19 18:50:42"

--start-date="2016-11-19 18:30:21"

友情链接:

binlog详细的操作例子请参考如下博客:

http://blog.chinaunix.net/uid-20494084-id-3753682.html

mysql5.7官方文档地址http://dev.mysql.com/doc/refman/5.7/en/preface.html

mysql数据库备份的更多相关文章

  1. Xtrabackup原理及使用innobackupex进行MySQL数据库备份恢复

    Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具. Xtrabackup中主要包含两个工 ...

  2. TODO:MongoDB MySQL数据库备份

    TODO:MongoDB MySQL数据库备份 1. MongoDB使用命令备份 mongodump进行整个数据库备份,主要用到的命令参数: -d 要备份的数据库 -o 输出的路径 ./mongodu ...

  3. Java实现MySQL数据库备份(二)

    权声明:本文为博主原创文章,未经博主允许不得转载. 博客<Java实现MySQL数据库备份(一)>使用I/O流的方式实现了MySQL数据库的备份,这种方法比较繁杂,下面介绍另一种备份MyS ...

  4. Java实现MySQL数据库备份(一)

    下班了,利用闲暇时间总结一下如何使用Java语言实现MySQL数据库备份: import java.io.BufferedReader; import java.io.File; import jav ...

  5. MySQL数据库备份命令

    原文参考:MySQL数据库备份的命令 - 司南 mysqldump -hhostname -uusername -ppassword databasename > backupfile.sql备 ...

  6. MySQL数据库备份和还原的常用命令

    其实很多情况下mysql备份就是采用了这些命令,例如: mysql导入和导出数据 linux自动定时备份web程序和mysql数据库 备份MySQL数据库的命令 mysqldump -hhostnam ...

  7. Java实现mysql数据库备份

    Runtime是一个与JVM运行时环境有关的类,这个类是Singleton的. Runtime.getRuntime()可以取得当前JVM的运行时环境,这也是在Java中唯一一个得到运行时环境的方法. ...

  8. Mysql数据库备份和还原常用的命令

    Mysql数据库备份和还原常用的命令是进行Mysql数据库备份和还原的关键,没有命令,什么都无从做起,更谈不上什么备份还原,只有给系统这个命令,让它去执行,才能完成Mysql数据库备份和还原的操作,下 ...

  9. MySQL数据库备份还原(基于binlog的增量备份)

    MySQL数据库备份还原(基于binlog的增量备份) 一.简介 1.增量备份      增量备份 是指在一次全备份或上一次增量备份后,以后每次的备份只需备份与前一次相比增加或者被修改的文件.这就意味 ...

  10. Mysql数据库备份和按条件导出表数据

    Mysql数据库备份和按条件导出表数据   一.备份数据库 # mysqldump -u root -p  dbcurr>/home/20090219.sql   mysqldum为备份命令,- ...

随机推荐

  1. python中的函数

    Python 函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也 ...

  2. 从零开始山寨Caffe·柒:KV数据库

    你说你会关系数据库?你说你会Hadoop? 忘掉它们吧,我们既不需要网络支持,也不需要复杂关系模式,只要读写够快就行.    ——论数据存储的本质 浅析数据库技术 内存数据库——STL的map容器 关 ...

  3. IO总结

    在电脑是新建一个文件夹 File file = new File("F:\\imgs"); File file = new File("F:/imgs"); 输 ...

  4. 如何查看bash shell 帮助信息?

    man bash 查看bash的命令帮助 info bash 查看bash的文档 help 命令显示bash支持的命令: 如果想看某个命令的帮助可以 help 命令.如 help cd 对bash的命 ...

  5. 基于java平台的常用资源整理

    这里整理了基于java平台的常用资源 翻译 from :akullpp | awesome-java 大家一起学习,共同进步. 如果大家觉得有用,就mark一下,赞一下,或评论一下,让更多的人知道.t ...

  6. JavaScript 中string方法

    注意:JavaScript的字符串是不可变的(immutable),String类定义的方法不能改变原来字符串内容,例如String.toUpperCase()这样的方法,返回的是全新的字符串,而不是 ...

  7. (转)对博士学位说永别 by 王珢

    对博士学位说永别 by 王垠 经过深思熟虑之后,我决定再次“抛弃”我的博士学位.这是我第三次决定离开博士学位,也应该是最后一次了.这应该不是什么惊人的消息,因为我虽然读博士10年了,可是我的目标从来就 ...

  8. iOS 让按钮上的标题换行显示

    项目中遇到了要让按钮上的文字换行显示的需求,就写了这个博客. 1.如果按钮上的文字固定,形式是写死的,可以考虑给标题文字加\n换行符来达到效果,但是,记得一定要设置这个属性,不然是不会换行的, but ...

  9. css屏蔽元素的鼠标事件pointer-events

    // 屏蔽点击 $('body').css('pointer-events', 'none'); //恢复默认 $('body').css('pointer-events', 'auto');   用 ...

  10. PHP 通过百度API 实现通过城市名称获取经度

    $city = $_GET['city'];print_r(getjw($city));/*** $city 需要查询的地址* $key 百度开发者账号*/function getjw($city){ ...