社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

MySQL数据库的mysqldump完全备份、binlog的增量备份与还原

陪我闹丶 • 4 年前 • 57 次点击  

MySQL数据库的mysqldump完全备份、binlog的增量备份与还原

一、 备份的目的:

做灾难性恢复:对损坏的书籍进行恢复和还原

需求改变:因需求改变而需要把数据还原到改变以前

二、 备份需要考虑的问题:

可以容忍丢失多长时间的数据;(数据不能百分百全部恢复)

恢复数据要在多长时间内完成;

恢复的时候是否需要持续提供服务;

恢复的对象:是整个库、多个表,还是单个库、单个表。

备份的数据库大小不超过50G

三、 按照备份时对数据库的影响范围分类:

hot backup :指在数据库运行中直接备份,对正在运行的数据库没有任何影响;称为 在线备份(Online
Backup) (备份的同时,业务不受影响)

cold backup:指在数据库停止的情况下进行备份;称为 离线备份(Offline
Backup) (需要关mysql服务,读写请求均不允许状态下进行)

warm backup:同样在数据库运行时进行备份,但仅支持读请求,不允许写请求;例如:加一个读锁以保证备份数据的一致性 (服务在线,但仅支持读请求,不允许写请求)

四、 按照备份后文件内容分类:

逻辑备份:指备份后的文件内容是可读的,通常为文本文件,内容一般是SQL语句,或者是表内的实际数据;适用于数据库的升级和迁移,回复时间较长

mysqldump(MySQL中称为导出工具)

物理文件备份:对数据库物理文件(如数据文件、日志文件等)的备份;恢复时间较短

支持热备份与冷备份

五、 按照备份数据库的内容分类:

完全备份:每次对数据进行完整的备份(备份的是数据库中的全部数据),包含用户表、系统表、索引、视图和存储过程等,但需要花费更多的时间和存储空间。

差异备份:在上一次完全备份原有的基础上,对更新的数据进行备份(对上一次完整备份后更新的数据)

增量备份:在上次备份的基础上,对更新的数据进行备份

日志备份:二进制日志备份

注:建议的备份策略

完全备份 + 增量备份 + 二进制日志

完全备份 + 差异备份 + 二进制日志

六、 逻辑备份工具 mysqldump:

  1.  mysqldump属于单线程(备份时间较长),通过tcp协议连接到mysql数据库,将数据转换成标准的SQL语句
    
    • 1
  2.  优点:
    
    • 1

备份“粒”度灵活;既可以针对整个MySQL服务,也可以只备份某个或者某几个DB,或者还可以指定只备份某个或者某几个表对象,甚至可以实现只备份表中某些符合条件的记录(-w, --where: 只导出符合条件的记录)。

  1.  缺点:
    
    • 1

a) 当数据是浮点数时,会出现精度丢失。

b) Mysqldump的备份过程属于逻辑备份,备份速度、恢复速度与物理备份工具相比较慢,而且mysqldump备份的过程是串行化的,不会并行的进行备份,当数据量较大时,一般不会使用mysqldump进行备份,因为效率较低。只适合备份50G以下的数据

  1.  mysqldump对innodb存储引擎支持热备
    
    • 1
  2.  mysqldump对myisam存储引擎只支持温备
    
    • 1

七、 导出数据的语法及选项:

语法: mysqldump [options] [db_name [tbl_name …]]>导出的文件名.sql

语法: mysqldump 选项 库名.表名(一个或多个) >导出的文件名.sql

常用的参数:

-?, --help: 显示帮助信息,英文的;

-u, --user: 指定连接的用户名;

-p, --password: 指定用户的密码,可以交互输入密码;

-S , --socket: 指定socket文件连接,本地登录才会使用。

-h, --host: 指定连接的服务器名称或者IP。

-P, --port=: 连接数据库监听的端口。

–default-character-set:
设置字符集,默认是UTF8。

-A,–all-databases:
导出所有数据库。不过默认情况下是不会导出information_schema系统数据库。

-B, --databases:
导出指定的某个/或者某几个数据库,参数后面所有名字都被看作数据库名,用空格隔开,包含CREATE DATABASE创建库的语句。

–tables: 导出指定表对象,参数格式为“库名
表名”,默认该参数将覆盖-B参数。

-w, --where: 只导出符合条件的记录。

-l, --lock-tables:
默认参数,锁定读取的表对象,想导出一致性备份的话最好使用该参数,但会导致无法对表执行写入操作。

–single-transaction:

该选项在导出数据之前提交一个BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于innoDB存储引擎。

在InnoDB导出时会建立一致性快照,在保证导出数据的一致性前提下,又不会堵塞其他会话的读写操作。指定这个参数后,其他连接不能执行ALTER TABLE、DROP TABLE 、RENAME TABLE、TRUNCATE TABLE这类语句,事务的隔离级别无法控制DDL语句。本选项和–lock-tables 选项是互斥的,使用参数–single-transaction会自动关闭该选项。

-d, --no-data: 只导出表结构,不导出表数据。

-t, --no-create-info: 只导出数据,而不添加CREATE TABLE
语句。

-f, --force: 即使遇到SQL错误,也继续执行。

-F, --flush-logs: 在执行导出前先刷新二进制日志文件,一般来说,如果是全库导出,建议先刷新日志文件,否则就不用了。

-x, --lock-all-tables: 在导出任务执行期间锁定所有数据库中的所有表,以保证数据的一致性。这是一个全局锁定,并且自动关闭–single-transaction 和–lock-tables 选项。这个参数副作用比较大,这是全库锁定,备份执行过程中,该库无法进行读写操作,不是所有业务场景都能接受的。请慎用。(读写操作无法执行)

-n, --no-create-db: 不生成建库的语句CREATE DATABASE … IF EXISTS,即使指定—all-databases或–databases这类参数。

–triggers: 导出表的触发器脚本,默认就是启用状态。使用–skip-triggers禁用它。

-R, --outines: 导出存储过程以及自定义函数

导出数据:

A:导出所有数据库

mysql -u用户名
-p密码 -A>导出的文件名.sql

#mysqldump -uroot -p123456 -A >all.sql

#mysqldump -uroot -p123456 --all-databases >all2.sql

参数-A代表所有,等同于—all-databases

B:导出某个数据库

mysqldump
-u 用户名 -p 数据库名 > 导出的文件名.sql

#mysqldump -uroot -p123456 book >book.sql

#vim book.sql

C:导出单张表

#mysqldump -uroot -p123456 book books >books.sql #导出book库books表

D:导出库的表结构

#mysqldump -uroot -p123456 -d book>booktable.sql #只导出book库的表结构

E:只导出数据

#mysqldump -uroot -p123456 -t book>bookdata.sql #只导出book库中的数据

F:导出数据库,并自动生成库的创建语句

#mysqldump -uroot -p123456 -B book2 >book2.sql

#mysql -uroot -p123456 < book2.sql 导入不用指定数据名

导入数据:

A:导入所有数据库

#mysql -uroot -p123456 <all.sql

B:导入数据库

#mysql -uroot -p123456 book <book.sql #如果导入时,没有对应的数据库,需要你手动创建一下:mysql> create database book;

使用source导入

mysql> create database book;

mysql> use book;

mysql> source /root/book.sql

c:导入表

mysql> drop table books;

mysql> source /root/books.sql;
##导入表时,不需要重新,创建表。要先进到相应的数据库中

mysql> select * from books;

D:导入表结构和数据

mysql> create database book;

#mysql -uroot -p123456 book<booktable.sql

#mysql -uroot -p123456 book<bookdata.sql

八、 二进制日志:Binary Log & Binary Log Index

  1. mysql的二进制日志记录着数据库的所有增、删、改等操作日志(前提是要在自己的服务器上开启binlog),还包括了这些操作的执行时间。

2.binlog的用途:

1):主从同步

2):恢复数据库

执行mysql> show
variables like ‘log_bin%’;查看binlog是否开启

Off表示mysql当前binlog功能没有开启。

mysql>
flush logs; 刷新日志

filename.index 存放binlog的日志清单文件

开启binary
log功能:

修改/etc/my.cnf配置文件使二进制文件生效,添加如下内容:

log-bin=/data/mysql/log/mysql_bin
(二进制日志文件存放路径)

server-id=1

重启Mysql服务,使配置文件修改生效

[root@localhost log]# systemctl
restart mysqld

九、 binlog的附加选项参数:

1、“max-binlog-size”设置binlog 的最大存储上限,一般设置为512M或1G,一般不能超过1G。

2、“binlog-do-db=db_name”参数明确告诉MySQL,需要对某个(db_name)数据库记录binlog,如果有了“binlog-do-db=db_name”参数的显式指定,MySQL 会忽略针对其他数据库执行的sql query,而仅仅记录针对指定数据库执行的sql query。

3、“binlog-ignore-db=db_name”与“binlog-do-db=db_name”完全相反,它显式指定忽略某个(db_name)数据库的binlog 记录,当指定了这个参数之后,MySQL 会记录指定数据库以外所有的数据库的binlog。

4、binlog-cache-size :一个事务,在没有提交(uncommitted)的时候,产生的日志,记录到Cache中;等到事务提交(committed)的时候,则把日志持久化到磁盘。

十、查看二进制日志:

1、查看binlog日志文件列表:

mysql> show binary logs;

2、查看当前使用的二进制文件及日志文件中事件当前位置:

mysql> show master status;

Binlog_Do_DB:显示对那个数据库进行增、删、改操作

3、删除所有的二进制日志:

mysql>reset master;

restet master:清空index文件中列出的所有二进制日志,并创建一个新的二进制日志文件

4、重新开始一个新的日志文件:

使用flush logs生成新的二进制日志文件,用以保存之后的数据库操作语句的记录。

mysql> flush logs; 用于生成新的binlog日志文件

5、查看binlog(二进制日志文件)内容命令语法:

查看二进制日志文件语法格式: mysqlbinlog [options] log_file …

mysqlbinlog选项:

-v:显示简化的日志内容

-vv:显示详细的日志内容

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/52902
 
57 次点击