创建用户备份的用户

MariaDB [mysql]> create user 'backdata'@'localhost' identified by 'test@123456';
Query OK, 0 rows affected (0.00 sec)

MariaDB [mysql]> grant select,lock tables,replication client,reload,show view,event,trigger on *.* to 'backdata'@'localhost';
Query OK, 0 rows affected (0.00 sec)

在本地电脑上,找一块大的硬盘,然后创建一个目录,专门存放备份

[root@blog ~]# mkdir /opt/mysql_backup

mysqldump参数详解

-u 指定用户

-p 密码

-P 端口

-S socket文件

-h 主机

--master-data=2表示在dump过程中记录主库的binlog和pos点,并在dump文件中注释掉这一行;

-A 备份所有的数据库

-B 数据库  指定要备份的数据库

-d 不备份数据,只备份表结构

-e event  事件

-R 存储过程

--triggers 触发器

--single-transaction

--lock-all-tables

注意:在从库上执行备份时,即--dump-slave=2,这时整个dump过程都是stop io_thread的状态

理解--single-transaction

thread_id: 35
 argument: FLUSH TABLES WITH READ LOCK
说明:因为开启了--master-data=2,这时就需要flush tables with read lock锁住全库,记录当时的master_log_file和master_log_pos

thread_id: 35
 argument: SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
说明:--single-transaction参数的作用,设置事务的隔离级别为可重复读,即REPEATABLE
READ,这样能保证在一个事务中所有相同的查询读取到同样的数据,也就大概保证了在dump期间,如果其他innodb引擎的线程修改了表的数据并提交,对该dump线程的数据并无影响

thread_id: 35
 argument: START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */
这时开启一个事务,并且设置WITH CONSISTENT
SNAPSHOT为快照级别,如果只是可重复读,那么在事务开始时还没dump数据时,这时其他线程修改并提交了数据,那么这时第一次查询得到的结果是其他线程提交后的结果,而WITH
CONSISTENT
SNAPSHOT能够保证在事务开启的时候,第一次查询的结果就是事务开始时的数据A,即使这时其他线程将其数据修改为B,查的结果依然是A

理解--lock-all-tables

thread_id: 120
 argument: FLUSH TABLES WITH READ LOCK
这里flush tables with read lock之后就不会主动unlock tables,保证整个dump过程整个db数据不可更改,也没有事务的概念了

一)备份和恢复所有库

[root@blog ~]# mysqldump -S /tmp/mysql.sock -u backdata -p -A >/opt/mysql_backup/alldata_$(date +%F_%H).sql

[root@blog ~]# cat /opt/mysql_backup/alldata_2018-04-27_11.sql---查看是否存在

如下

(插入完毕后,然后执行UNLOCK tables)

  • 模拟恢复数据

mysql> drop database louisblog;
Query OK, 12 rows affected (0.09 sec)

[root@blog ~]# mysql -u root -p < /opt/mysql_backup/alldata_2018-04-27_11.sql
Enter password:

(由于备份数据的用户,没有权限create table和create database,已经insert权限,这边需要root用户来操作)

二)备份单个库

[root@blog ~]# mysqldump -S /tmp/mysql.sock -u backdata -p -B louisblog > /opt/mysql_backup/louisblog_$(date +%F_%H).sql
Enter password:
[root@blog ~]# mysqldump -S /tmp/mysql.sock -u backdata -p -B mysql > /opt/mysql_backup/mysql_$(date +%F_%H).sql
Enter password:
[root@blog ~]# cd /opt/mysql_backup/
[root@blog mysql_backup]# ll
total 4900
-rw-r--r-- 1 root root 1669688 Apr 27 11:41 alldata_2018-04-27_11.sql
-rw-r--r-- 1 root root 1669688 Apr 27 12:01 alldata_2018-04-27_12.sql
-rw-r--r-- 1 root root 994517 Apr 27 13:19 louisblog_2018-04-27_13.sql
-rw-r--r-- 1 root root 676300 Apr 27 13:20 mysql_2018-04-27_13.sql

  • 还原数据库

mysql> source /opt/mysql_backup/louisblog_2018-04-27_13.sql
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

三) 分库备份脚本

#!/bin/bash
#定义变量
USER="backup"
PASS="Aa123321"
HOST="localhost"
DATE="$(date +%F_%H)"
MYCMD="/usr/local/mysql/bin/mysql -u$USER -p$PASS"
BACKUPDIR="/opt/backup/database/"
MYDUMP="/usr/local/mysql/bin/mysqldump -u$USER -p$PASS  -B  -R -E --triggers  --single-transaction --master-data=2"
DBLIST=`$MYCMD -e "show databases;"|sed 1d|egrep -v "_schema|test"`
#判断备份目录是否存在
[ ! -d ${BACKUPDIR}/${DATE} ] && mkdir -p ${BACKUPDIR}/${DATE}
#刷新生成二进制日志
$MYCMD -e "flush logs;"
#循环备份数据库
for dbname in $DBLIST;do
$MYDUMP $dbname|gzip >${BACKUPDIR}/${DATE}/${dbname}.sql.gz
done
#删除7天前的文件
cd $BACKUPDIR && find . -type d -mtime +7 |xargs rm -f

四)分库分表备份

#!/bin/bash
#description: Use mysqldump to backup mysql.
# GRANT SELECT, RELOAD, SUPER, LOCK TABLES, REPLICATION CLIENT, SHOW VIEW, EVENT, TRIGGER ON *.* TO 'backup'@'localhost'
#编写my.cnf文件,添加
#[client]
#user = backup
#password = Aa123321

#定义变量
HOST="localhost"
DATE="$(date +%F_%H)"
MYCMD="/usr/local/mysql/bin/mysql --defaults-extra-file=/etc/my.cnf"
BACKUPDIR="/opt/backup/database"
MYDUMP="/usr/local/mysql/bin/mysqldump --defaults-extra-file=/etc/my.cnf -R -E --triggers -x --master-data=2"
DBLIST=`$MYCMD -e "show databases;"|sed 1d|egrep -v "_schema|test"`
#判断备份目录是否存在
[ ! -d ${BACKUPDIR}/${DATE} ] && mkdir -p ${BACKUPDIR}/${DATE}
#刷新生成二进制日志
$MYCMD -e "flush logs;"
#循环备份数据库
for dbname in $DBLIST;do
TLIST=`$MYCMD -e "show tables from $dbname;"|sed 1d`
for tname in $TLIST;do
mkdir -p $BACKUPDIR/${DATE}/$dbname
$MYDUMP $dbname $tname|gzip >${BACKUPDIR}/${DATE}/${dbname}/${dbname}_${tname}_${DATE}.sql.gz
done
done

MySQL数据库备份之mysqldump的更多相关文章

  1. MySQL数据库备份工具mysqldump的使用(转)

    说明:MySQL中InnoDB和MyISAM类型数据库,这个工具最新版本好像都已经支持了,以前可能存在于MyISAM的只能只用冷备份方式的说法. 备份指定库: mysqldump -h127.0.0. ...

  2. MySQL用户管理、常用sql语句、MySQL数据库备份恢复

    1.MySQL用户管理 给远程登陆用户授权:grant all on *.* to 'user1'@'127.0.0.1' identified by '123456' (这里的127.0.0.1是指 ...

  3. mysql数据库备份及恢复命令mysqldump,source的用法

    还原一个数据库:mysql -h localhost -u root -p123456 www<c:/www.sql 备份一个数据库:mysqldump -h localhost -u root ...

  4. 在给mysql数据库备份时,报错: mysqldump: Got error: 145: Table '.\shengdaxcom\pre_forum_thread' is marked as c rashed and should be repaired when using LOCK TABLES

    在给mysql数据库备份时,报错: mysqldump: Got error: 145: Table '.\shengdaxcom\pre_forum_thread' is marked as cra ...

  5. TODO:MongoDB MySQL数据库备份

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

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

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

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

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

  8. MySQL数据库备份命令

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

  9. mysql数据库备份与还原命令

    还原一个数据库:mysql -h localhost -u root -p123456 www 备份一个数据库:mysqldump -h localhost -u root -p123456 www ...

随机推荐

  1. linux systemd 从简单的例子入门

    linux systemd 从简单的例子入门 网上很多相关链接,一上来就给一大堆命令和讲解,让人头都大. 我们希望有一个service(服务),让它在开机启动的时候就执行. 用 root 登陆以后: ...

  2. 50道sql练习题及答案与详细分析

    数据表介绍 --1.学生表 Student(SId,Sname,Sage,Ssex) --SId 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 --2.课程表 Course( ...

  3. .NET Core、EF、Dapper、MySQL 多种方式实现数据库操作(动态注册实体类)

    目录 前言 一.技术选型 二.遇到的坑 2.1..NET Core 下 EF 的问题 2.2.数据库实体类的注册 切记坑 前言 最近在学习.研究 .NET Core 方面的知识,动手搭建了一些小的 D ...

  4. 四舍五入toFoxed方法

    四舍五入的方法: Number.prototype.toFixed = function (n) { if (n > 20 || n < 0) { throw new RangeError ...

  5. TODO Android +jacoco的增量覆盖率测试和一些概念

    查了下资料,工具要用mac开发,,,,陷入窘境,正在寻找替代方案. Android中的jacoco只支持offline模式,spring支持on-the-fly(在加载class文件进行,运用java ...

  6. Hive窗口函数案例详解

    语法: 分析函数 over(partition by 列名 order by 列名 rows between 开始位置 and 结束位置) 常用分析函数: 聚合类 avg().sum().max(). ...

  7. fsLayuiPlugin树+数据表格使用

    fsLayuiPlugin 是一个基于layui的快速开发插件,支持数据表格增删改查操作,提供通用的组件,通过配置html实现数据请求,减少前端js重复开发的工作. GitHub下载 码云下载 测试环 ...

  8. 杭电2019多校第八场 Acesrc and Good Numbers——思维打表&&oeis

    题意 给定 $d,x$,$f(d,k)$ 表示 $1 \sim k$ 中 $d$ 出现的次数, $k$ 满足 $f(d,k) = k$,求小于 $x$ 的最大的 $k$. 分析 正解不会...,学习了 ...

  9. 原生JS实现滑动验证功能

    一般很多网站都有滑动验证的功能,简单滑动验证的原理如下图所示: 主要理解思想就行 图中的代码可能和实际写的有所不同 HTML和CSS也可根据仔细的喜好就行修改 完整代码: <!DOCTYPE h ...

  10. <frame>、<iframe>、<embed>、<object> 和 <applet>

    frame frame 必须在 frameset 里,而 frameset 又不能和 body 共存(就是一旦存在 frame,就不能存在 body 了,因此这个基本每人使用) 推荐阅读:https: ...