首页 > 数据库 >MySQL 数据备份

MySQL 数据备份

时间:2023-12-07 19:11:37浏览次数:39  
标签:-- 备份 MySQL 数据备份 mysqldump mysql 数据库

备份类型

常见的备份有冷备份、温备份、热备份,还有什么物理备份、逻辑备份、增量备份、差异备份等等。


冷备份: 需要服务停止,在备份期间不能进行读和写操作。


温备份: 读操作可执行;但写操作不可执行


热备份: 读和写都可以正常进行,不影响数据备份


逻辑备份: 导出数据库中的数据和对象定义为标准 SQL 语句保存在文本文件中。这些 SQL 语句可以重新执行来恢复数据库。


物理备份: 直接复制数据库的文件,包括数据文件、索引文件和日志文件等。它是对数据库文件系统层面的直接拷贝。

MySQL 备份内容

用户信息: 例如MySQL的账号信息,账号的权限等。这些都是存放再mysql这个数据库中的。


业务数据: 相关的业务数据库


配置文件: MySQL服务的相关配置

MySQL 物理备份

一种方法是将mysql服务停止后,将整个数据目录进行拷贝或者打包,例如利用tar、cp、rsync等工具

还有一种方法就是利用专门的物理备份工具,例如xtrabackup就是一个非常好用的物理备份工具。

xtrabackup 介绍

xtrabackup是 Percona 开发的一个数据库物理备份工具,100%开源。主要用来执行MySQL、Percona Server 和 MariaDB 数据库的备份和恢复操作。


官方文档:https://docs.percona.com/percona-xtrabackup/innovation-release/


xtrabackup具有以下特点:


1、非常适合大型数据库以及需要快速备份还原和需要支持灾难级备份的场景。


2、支持增量备份、对备份数据进行压缩、数据加密等功能


3、xtrabackup主要是用来操作innodb这种存储引擎的数据,且整个过程是非阻塞的。在备份过程中,对数据库的读写操作可以继续进行,适合需要7*24小时运行的环境


4、正是因为xtrabackup是直接操作数据库文件和日志,所以对数据库的内部结构(如数据字典、redo log 格式)高度敏感。当这些内部结构在数据库的新版本中发生变化时,XtraBackup 需要更新以适应这些更改。并且高版本不能向下兼容低版本。

xtrabackup 安装

安装的时候需要先确认需要备份的数据库版本,然后再参考官方文档下载合适的 xtrabackup 版本才行。上面也说了,MySQL不同版本的文件结构有差别,所以造成不能高版本兼容低版本的问题。


例如:mysql的版本是5.7.x,那么就需要下载 2.4版本的xtrabackup,8.0版本的xtrabackup不能备份mysql5.7。

xtrabackup 备份数据

备份整个数据库

XtraBackup 是直接备份物理文件的工具,但是也需要连接到 MySQL。因为需要知道MySQL的一些配置(如 datadir、innodb_data_home_dir、innodb_log_group_home_dir 等),通过这些配置来确定需要备份的文件。


还有就是读取二进制日志位置来确保备份可以用于点恢复操作。连接MySQL的参数和mysql命令行工具是一样的。

1、创建备份目录

需要执行备份操作的过程中,具有对这个目录的读和写权限,所以可以直接以root用户身份执行。

mkdir /home/ehigh/mysql_bak
2、执行备份操作

通过 --backup 选项可以执行全备份。


例如:

sudo xtrabackup --backup --host="192.168.15.12" --user="root" --password="eHIGH2014" --port=3306 --datadir="/var/lib/mysql" --target-dir="/home/ehigh/mysql_bak"
3、数据恢复前的准备

通过 --prepare 选项让 xtrabackup完成一些数据恢复前的准备工作,因为执行物理备份时,XtraBackup 复制的是数据库文件的实时状态,包括那一刻的所有数据文件和日志文件。


这个状态下可能会有未完成的事务等等。通过这个操作可以将这些未完成的事务回滚。保证恢复时数据库的一致性。


而且执行这个操作是不会影响到现有数据的,因为这个操作仅针对备份的数据进行处理,只会处理备份目录中的备份文件,例如应用重做日志和回滚未完成的事务。

sudo xtrabackup --prepare --target-dir="/home/ehigh/mysql_bak"
4、进行数据恢复

(1)停止服务。避免在恢复数据时发生数据损坏。

sudo systemctl stop mysql.service

(2)清空数据目录。

sudo rm -rf /var/lib/mysql

mv /var/lib/mysql /var/lib/mysql-bak

mkdir /var/lib/mysql

chown -R mysql:mysql /var/lib/mysql 

(3)执行数据恢复
执行数据恢复一种方法是直接使用cp或者rsync工具将备份目录下的所有文件拷贝到mysql数据目录中,还有种方法就是通过 --copy-back 或 --move-back 选项从备份目录将数据恢复到原始 MySQL 数据目录。


这两个参数的区别如下:

  • --copy-back:将备份数据复制回 MySQL 的数据目录。这个过程不会删除或更改备份目录中的原始备份文件

  • --move-back:将备份数据移动(而非复制)回 MySQL 的数据目录,移动过后备份目录中就不存在备份文件了

sudo xtrabackup --copy-back  --target-dir=/home/ehigh/mysql_bak  --datadir=/var/lib/mysql

(4)更改文件权限
将MySQL数据目录下的文件权限改为mysql

sudo chown -R /var/lib/mysql

备份整个数据库并压缩数据

xtrabackup不同版本支持的压缩算法不同,具体信息可以看官方文档确认。通过 --compress选项即可再备份数据的时候,将数据进行压缩。

1、备份数据

例如:

sudo xtrabackup --backup --host="192.168.15.12" --user="root" --password="eHIGH2014" --port=3306 --compress --compress-threads=4   --datadir="/var/lib/mysql" --target-dir="/home/ehigh/mysql_bak_c"
2、恢复数据前先解压缩

在备份数据的时候xtrabackup会通过自带的一些压缩算法库文件将文件进行压缩,但是解压的时候需要在系统上安装对应的工具才行。

通过 --decompress 选项即可完成解压

sudo xtrabackup --decompress --target-dir=/home/ehigh/mysql_bak_c
3、恢复前的准备

通过 --prepare 选项完成恢复前的准备,具体操作和上面一样的

4、数据恢复

(1)停止MySQL服务

(2)清空MySQL数据目录

(3)使用 xtrabackup 恢复数据

(4)修改MySQL数据目录中文件的属主和属组

备份单个数据库

XtraBackup 备份单个数据库的操作比较特殊,因为 XtraBackup 主要设计用于备份整个 MySQL 服务器的。备份单个库用mysqldump就行了。

MySQL 逻辑备份

就是将数据库中的数据备份为SQL语句,将这些SQL语句存放在一个文件中,恢复数据的时候直接执行这个文件里面的SQL即可重现数据。

mysqldump

mysqldump是mysql服务自带的一个工具,mysqldump可以跨平台使用且使用简单,非常适用于小到中等规模的数据库。

默认情况下,mysqldump 工具将生成的 SQL 语句输出到标准输出(stdout)。如果直接运行 mysqldump 命令而不进行任何重定向,它会在命令行界面中显示 SQL 语句。

备份整个数据库

mysqldump -u 用户名 -p 用户密码  database_name > backup.sql

通过这种方法备份整个数据库时,会生成一个包含所有表结构和数据的 SQL 文件,但不会包含 CREATE DATABASE 语句。即恢复数据的时候需要手动将对应的数据库创建好,然后再将数据导入到该数据库中。

如果需要生成一个带 CREATE DATABASE 语句 的sql文件,加一个 --databases 参数就可以了。

备份多个数据库

如果需要一次性备份多个指定的数据库,可以通过 mysqldump 的 --databases 选项来实现。还可以用 -B 参数,-B参数效果和 --databases 一样的。

mysqldump -u user_name -p password --databases db1 db2 db3 > backup.sql

备分所有数据库

如果想将所有数据库进行备份的话,通过 --all-databases 选项可以实现,也可以用 -A 参数,效果是一样的

mysqldump -u user_name -p password --all-databases > backup.sql

备份单个数据表

如果只想要备份单张表,只需要在数据库的后面指定表名就行了。

mysqldump -u user_name -p password database_name table_name > backup.sql

备份多个数据表

在数据库的后面指定多个表名就行了。

mysqldump -u user_name -p password database_name tb1 tb2 tb3 > backup.sql

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

仅备份数据库结构(例如,表定义、视图、存储过程等),但不包含任何实际数据,可以使用 --no-data 选项。

mysqldump -u user_name -p password --no-data database_name table_name > backup.sql

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

只想备份数据而不包括表结构,可以使用 --no-create-info 选项

mysqldump -u user_name -p password --no-create-info database_name table_name > backup.sql

备份表的一部分数据

如果需要备份一个数据表中的部分数据,通过 -where 选项来指定符合特定条件的数据。


例如:备份id < 1000 的数据

mysqldump -u user_name -p password --databases db1 tables1  --where="id < 1000" > users_backup.sql

备份存储过程和函数

使用 --routines 选项可以确保存储过程和函数被包含在备份中,也可以使用简写的-R参数。

mysqldump -u user_name -p --no-create-info --no-data --no-create-db --routines --skip-triggers database_name > routines_backup.sql

打开备份的sql文件,我们可以看到 /*!50003 ... */ 这是MySQL的一种特殊注释模式,称为“条件注释”或“版本控制注释”。这些注释内容实际上会被 MySQL 执行。


/*!50003 ,这里的50003表示该命令需要的最低 MySQL 版本为 5.00.03,MySQL版本大于或等于这个版本的时候,注释中的内容会被执行。

mysqldump 高级选项

在备份数据的过程中,可以添加一些选项来对备份进行优化:

1、优化备份速度:

如果备份一个数据量很大的库或者表,mysqldump 默认会读取整个表到内存中,然后写入到备份文件。如果表非常大,这可能会消耗大量内存,并可能导致过度的内存使用甚至崩溃。

这个时候可以通过 --quick 选项,它是直接逐行读取数据并写入备份文件,显著减少了一次性内存需求。从而加快备份速度。


2、主从复制环境:

默认情况下,备份数据文件的时候,是不会记录当前二进制日志位置的。使用 --master-data 时,mysqldump 会在 SQL 备份文件中添加一个 CHANGE MASTER TO 语句。

这个语句包含了备份时刻的二进制日志文件名和位置(log file position)。这对于设置复制非常重要,因为它指明了从服务器(slave)开始读取主服务器(master)二进制日志的起始点。


--master-data有两个值,默认值是2

  • --master-data=1:以非注释形式包含 CHANGE MASTER TO 语句

  • --master-data=2:使CHANGE MASTER TO 语句以注释形式添加,从而在不自动更改从服务器配置的情况下提供必要的信息。


--master-data 选项经常结合 --flush-logs 选项一起使用,--flush-logs 会在备份开始前刷新 MySQL 服务器的日志,包括二进制日志(binary log)。此时 MySQL 会关闭当前的二进制日志文件并开始一个新的日志文件。


说明:

--master-data 选项在 mysqldump 输出的 CHANGE MASTER TO 语句中主要包含 MASTER_LOG_FILE 和 MASTER_LOG_POS 参数,这些参数指明了二进制日志(binary log)的文件名和位置。

但是,这个语句并不包含完整的主服务器(master)配置,如 master_host、master_user、master_password 等。

所以这个参数主要用于记录备份时刻的二进制日志位置,这对于配置从服务器从正确的位置开始复制数据很重要,所以完整的数据配置可以自己手动修改这个sql文件实现。


3、innodb引擎表备份:

使用 --single-transaction 选项,mysqldump 会在开始备份之前启动一个新的事务。所以备份会捕捉到事务开始时刻的数据库状态,并且在整个备份过程中保持这一状态,即使后续对数据库进行了更改。


4、mysql数据库备份

mysql这个数据库里面存放了mysql的用户和权限信息,如果想让备份文件被恢复到另一个 MySQL 服务器上后,用户和权限的更改立即生效。需要加 --flush-privileges 选项

添加这个选项后,会在 SQL 备份文件中添加一条 FLUSH PRIVILEGES; 语句。当这个备份文件被导入到 MySQL 服务器时,FLUSH PRIVILEGES; 语句会执行,从而重新加载权限表。

这确保了任何用户和权限的更改(如新用户的添加或权限的修改)会立即生效。这样就不用手动刷新权限了。

5、mysam引擎备份
现在一般用的都是innodb这个存储引擎,使用mysqldump这个工具的时候,innodb是支持热备份的,而mysam只支持温备份,即备份过程中能读不能写。


如果备份所有数据库,通过 --lock-all-tables 选项或者 -x选项来加全局读锁,会锁定所有数据库的所有表。也会导致一个问题,数据量大时,可能会导致长时间无法并发访问数据库。

mysqldump -u user_name -p --lock-all-tables --all-databases > backup.sql

如果支持备份单个数据库,可以用 -lock-tables 参数,这样只会锁定正在备份的数据库中的表。备份操作不会影响到服务器上其他数据库中的表。

mysqldump -u user_name -p --lock-tables database_name > backup.sql

标签:--,备份,MySQL,数据备份,mysqldump,mysql,数据库
From: https://www.cnblogs.com/heyongshen/p/17874375.html

相关文章

  • MySQL LOAD DATA LOCAL, 如何跳过第一行?
    在MySQL中,使用LOADDATALOCAL命令可以将数据从本地的文件导入到数据库里面。常见的导入数据格式是csv和txt。但是在导入csv和txt格式的数据时,第一行通常是表头,而不是数据,因此我们需要跳过第一行,只导入后面的数据。阅读更多:MySQL教程 方法一:使用IGNORE关键字LOADDATALOCA......
  • MySQL创建索引的优缺点
    索引的优点1.创建唯一性索引,保证数据库表中每一行数据的唯一性2.大大加快数据的检索速度,这也是创建索引的最主要的原因3.加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。4.在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分......
  • windows 安装mysql 和不能通过ip访问到数据库
     一、确认windows是否已经安装mysql1.按【Win+R】打开运行2.输入【services.msc】打开服务3、在服务列表中查找MySQL,如果有mysql服务则表示Windows已经安装MySQL,如果没有MySQL服务则表示Windows没有安装MySQL二、下载MySQL安装包1、mysql官网下载地址  https://d......
  • mysql 实用的sql
    计算今日:SELECTCURRENT_DATE(); 计算本周一日期:SELECTDATE_SUB(CURDATE(),INTERVALWEEKDAY(CURDATE())DAY);计算本周日日期:SELECTDATE_ADD(CURDATE(),INTERVAL6-WEEKDAY(CURDATE())DAY); 计算本月第一天日期:SELECTDATE_SUB(CURDATE(),INTERVALDAY(CURDAT......
  • [小白入门指南] 如何使用gorm操作MySQL
    1.使用gorm的前置条件1.1MySQL的安装和配置1.2NaviacteForMySQL162.gorm基本操作2.1增2.2查2.3改2.4删2.5gorm迁移1.使用gorm的前置条件1.1MySQL的安装和配置Debian中安装MySQL|MySQL创建用户并授予权限#用rpm查看是否安装了MySQLrpm-qa|gr......
  • Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) MySql字符集及校对规则不
    查询时报错--用于解决报错>1267-Illegalmixofcollations(utf8mb4_0900_ai_ci,IMPLICIT)and(utf8mb4_general_ci,IMPLICIT)foroperation'='这个错误是由于在进行比较操作时涉及到不同的字符集和校对规则(collations)。涉及到了utf8mb4_0900_ai_ci和utf8mb4_general......
  • 在.net中通过自定义LoggerProvider将日志保存到数据库方法(以mysql为例)
     在.NET中,Microsoft.Extensions.Logging是一个灵活的日志库,它允许你将日志信息记录到各种不同的目标,包括数据库。在这个示例中,我将详细介绍如何使用Microsoft.Extensions.Logging将日志保存到MySQL数据库。我们将使用EntityFrameworkCore来与MySQL数据库进行交互。步骤一:创......
  • 浅析MySQL代价模型:告别盲目使用EXPLAIN,提前预知索引优化策略
    背景在MySQL中,当我们为表创建了一个或多个索引后,通常需要在索引定义完成后,根据具体的数据情况执行EXPLAIN命令,才能观察到数据库实际使用哪个索引、是否使用索引。这使得我们在添加新索引之前,无法提前预知数据库是否能使用期望的索引。更为糟糕的是,有时甚至在添加新的索引后,数......
  • Python 操作 MySQL 数据库
    Python标准数据库接口为PythonDB-API,PythonDB-API为开发人员提供了数据库应用编程接口。Python数据库接口支持非常多的数据库,你可以选择适合你项目的数据库:GadFlymSQLMySQLPostgreSQLMicrosoftSQLServer2000InformixInterbaseOracleSybase你可以访问Python数据库接口及API......
  • MySQL数据库中SQL语句分几类?
    SQL语句主要分为四类,分别是数据查询语言(DQL)、数据操作语言(DML)、数据定义语言(DDL)和数据控制语言(DCL)。1.数据查询语言(DQL):用于从数据库中的一个或多个表中查询数据,主要使用SELECT语句。2.数据操作语言(DML):用于修改数据库中的数据,包括插入(INSERT)、更新(UPDATE)和删除(DELETE)等操作。3.数......