C语言实现数据库备份和还原 (c 实现数据库的备份和还原)

随着信息化和互联网技术的快速发展,人们对于数据的重视程度越来越高。在企业运营和管理中,数据库作为数据管理的主要工具,其重要性不言而喻。但是,即使是最完善的系统也难以避免数据丢失、损坏等情况,这时备份和还原数据库就显得尤为重要。本文将介绍如何用的过程。

一、数据库备份

1. 创建备份文件

需要创建一个备份文件,将需要备份的数据库信息存储到备份文件中。在C语言中,可以使用fopen函数创建一个备份文件。有两种方式可以打开文件,一种是文本文件,一种是二进制文件。

“`

/* 打开备份文件 */

FILE *fp;

fp = fopen(“backup.dat”, “wb”);

if(format == TEXT) {

fp = fopen(“backup.txt”, “w”);

}

“`

其中,format是备份文件的格式,可以通过传参控制。如果是文本格式,就使用“w”打开文件,如果是二进制格式,就使用“wb”。

2. 遍历数据库

接下来,需要遍历数据库中的所有表格和数据,并将其写入备份文件中。可以使用MySQL提供的API函数进行遍历。

“`

/* 遍历数据库 */

MYSQL_RES *result;

MYSQL_ROW row;

mysql_query(conn, “show tables”);

result = mysql_use_result(conn);

while((row = mysql_fetch_row(result))) {

// 获取表名

char table[100];

sprintf(table, “%s”, row[0]);

// 获取表数据

int rows = getRows(conn, table);

mysql_query(conn, “set names utf8”);

sprintf(sql, “select * from %s”, table);

mysql_query(conn,sql);

result = mysql_store_result(conn);

// 写入表格信息到备份文件中

createTable(fp, rows, result, table);

}

“`

上述代码中,conn是MySQL连接句柄,getRows函数是获取表格的行数函数,sql是SQL语句,createTable是将表格信息写入备份文件中的函数。

3. 关闭文件

完成备份之后,需要关闭备份文件,释放内存。

“`

/* 关闭备份文件 */

fclose(fp);

mysql_free_result(result);

mysql_close(conn);

“`

二、数据库还原

1. 获取备份文件

在数据库还原的过程中,需要获取备份文件中的数据。同样,可以使用fopen函数打开备份文件并读取备份文件的数据。根据之前备份时选择的格式,可以通过“r”或“rb”方式打开备份文件。

“`

/* 获取备份文件 */

FILE *fp;

fp = fopen(“backup.dat”, “rb”);

if(format == TEXT) {

fp = fopen(“backup.txt”, “r”);

}

“`

2. 连接数据库

在获取备份文件之后,需要连接数据库。同样,可以使用MySQL提供的API函数进行连接。

“`

/* 连接数据库 */

MYSQL *conn;

conn = mysql_init(NULL);

mysql_real_connect(conn,”localhost”,”root”,””,”test”, 0, NULL, 0);

“`

3. 读取备份文件

接下来,需要从备份文件中读取数据,并还原到数据库中。具体操作是,读取备份文件中的表格信息,然后通过SQL语句将表格信息写入数据库中。

“`

/* 读取备份文件并还原到数据库中 */

while(fscanf(fp, “%s”, table) != EOF) {

// 获取表格信息

int rows;

fscanf(fp, “%d”, &rows);

char types[100][100], fields[100][100];

for(int i = 0; i

fscanf(fp, “%s %s”, types[i], fields[i]);

}

// 利用SQL语句将表格信息写入数据库中

char sql[1000];

sprintf(sql, “create table %s(“, table);

for(int i = 0; i

strcat(sql, fields[i]);

strcat(sql, ” “);

strcat(sql, types[i]);

strcat(sql, “,”);

}

sprintf(sql+strlen(sql)-1, “)”);

mysql_query(conn,sql);

}

“`

上述代码中,fscanf函数用于从备份文件中读取数据,而sprintf和strcat函数用于拼接SQL语句。

4. 关闭文件

还原完成之后,需要关闭备份文件,并释放内存。

“`

/* 关闭备份文件 */

fclose(fp);

mysql_close(conn);

“`

三、

本文介绍了如何用的过程。通过遍历数据库、创建备份文件、读取备份文件等操作,实现了备份和还原的功能。实际应用中,可以根据需要修改代码,适应不同的数据库系统、备份方式等情况。本文的代码示例同样适用于其他编程语言,读者可以参照代码实现自己的数据库备份和还原功能。

相关问题拓展阅读:

windows mysql几种备份和 恢复

1、复制date文件夹备份

============================

假想环境:

MySQL 安装位置:C:\MySQL

论坛数据库名称为:bbs

数据库备份目的地:C:\db_bak\

============================

新建db_bak.bat,写入以下代码

*******************************Code Start*****************************

net stop mysql

xcopy c:\mysql\data\bbs\*.* c:\db_bak\bbs\%date:~0,10%\ /S /I

net start mysql

*******************************Code End *****************************

然后使用Windows的“计划任务”定时执行该批处理脚本即可。(例肢扰做如:每天凌晨3点执行back_db.bat)

解释:备份和恢复的操作都比较简单,完整性比较高,控制备份周期比较灵活,例如,用%date:~0,10%。此方法适合有独立主机但对mysql没有管理经验的用户。缺点是占用空间比较多,备份期间mysql会短时间断李掘开(例如:针对30M左右的数据库耗时5s左右),针对%date:~0,10%的用法参考。

2、mysqldump备份成sql文件

==============

假想环境:

MySQL 安装位置:C:\MySQL

论坛数据库名称为:bbs

MySQL root 密码:123456

数据库备份目的地:D:\db_backup\

脚本:

rem *******************************Code Start*****************************

@echo off

set “Ymd=%date:~,4%%date:~5,2%%date:~8,2%”

C:\MySQL\bin\mysqldump –opt -u root –password=bbs > D:\db_backup\bbs_%Ymd%.sql

@echo on

rem *******************************Code End*****************************

将以上代码保存为backup_db.bat

然后使用Windows的“计划任务”定时执行该脚本即可。(例如:每天凌晨5点执行back_db.bat)

说明:此方法可以不用关闭数据库,并且可以按历衡每一天的时间来名称备份文件。

通过%date:~5,2%来组合得出当前日期,组合的效果为yyyymmdd,date命令得到的日期格式默认为yyyy-mm-dd(如果不是此格式可以通过pause命令来暂停命令行窗口看通过%date:~,20%得到的当前计算机日期格式),所以通过%date:~5,2%即可得到日期中的第五个字符开始的两个字符,例如今天为,通过%date:~5,2%则可以得到02。(日期的字符串的下标是从0开始的)

3、利用WinRAR对MySQL数据库进行定时备份。

对于MySQL的备份,更好的方法就是直接备份MySQL数据库的Data目录。下面提供了一个利用WinRAR来对Data目录进行定时备份的方法。

首先当然要把WinRAR安装到计算机上。

将下面的命令写入到一个文本文件里

*******************************Code Start*****************************

net stop mysql

c:\progra~1\winrar\winrar a -ag -k -r -s d:\mysql.rar d:\mysql\data

net start mysql

*******************************Code End*****************************

保存,然后将文本文件的扩展名修改成CMD。进入控制面版,打开计划任务,双击“添加计划任务”。在计划任务向导中找到刚才的CMD文件,接着为这个任务指定一个运行时间和运行时使用的账号密码就可以了。

这种方法缺点是占用时间比较多,备份期间压缩需要时间,mysql断开比之一种方法更多的时间,但是对于文件命名很好。

  设mysql 安装在c:盘,mysql数据库的用户名是root,密码是123456,数据库名是database_name,在d:盘根目录下面存放备份数据库,备份数据库名槐档字为database_name_backup_.sql(.sql为备份咐梁日期)

  备份数据库:

  mysqldump -uroot -pdatabase_name>d:/database_name_backup_.sql

  恢复数据库:

  删除原有数据库,建立数据库,把备份数据库导入。

  mysqladmin -uroot -pdrop database_name

  衡明运mysqladmin -uroot -pcreate database_name

  mysql -uroot -pdatabase_name

  注:在导入备份数据库前,database_name如果没有,是需要创建的;而且与database_name_backup_.sql中数据库名是一样的才能导入。

  注:环境Windows命令行。

前言

MySQL 5.6引入了GTID,每个事务都会产生一个GTID,我们可以通过验证主从GTID来验证主从数据的一致性。

为了叙述简便,定义一个量ALL_GTID: 表示某个数据库实例上 所有存在过的 或 将要存在的事务 的GTID(包括已经被purge掉的事务)。

在讨论数据库可用性的场景中, 当发生主备切换时, 需要进行数据补偿。通过比较主备的ALL_GTID,可以确定需要补偿多少数据:

在实例存活的情况,可以在实例状态中查询ALL_GTID。

在实例崩溃的情况,无法在实例状态中查询ALL_GTID。可以通过查询BINLOG中的Previous-GTIDs计算来获得ALL_GTID。

下面列举与ALL_GTID相关的变量。

与ALL_GTID相关的变量

Previous-GTIDs

Previous-GTIDs格式如下(环境为MySQL5.7,日志手动flush binary logs获得):

查看新轮转出的BINLOG:

下面为mysql-bin.00001中包含的GTID:

请点击输入图片描述

然后再次flush binary logs:

请点击输入图片描述

mysql-bin.00002中是没有任何GTID的。

请点击输入图片描述

综上Previous-GTIDs是本身这个BINLOG文件前面的所有BINLOG的。

请点击输入图片描述

全局变量中的GTID相关的变量

请点击输入图片描述

变量解释:

gtid_executed 代表着server上所有事务执行产生的GTID(包含已经被purge的BINLOG中的GTID或者是手动set gtid_purged的GTID)。

gtid_purged 代表着已经被purge到的GTID。gtid_purged是gtid_executed的子集。

gtid_retrieved 是从机上relay_log中的GTID。

ALL_GTID 的计算

了解了GTID相关的变量之后,可以得到获得实例的All_GTID的的方法:

对象

方法

存活的Master实例    gtid_executed    

存活的Slave实例    gtid_executed和gtid_retrieved的并集    

非存活Master实例    最后一个BINLOG文件的Previous-GTIDs + 最后一个BINLOG文件中所有的GTID    

非存活Slave实例    最后一个BINLOG文戚亏件的Previous-GTIDs + 最后一个BINLOG文件中所有的GTID    

在获得非存活实例中的ALL_GTID时,最后一个BINLOG文件中的GTID可能不连续(比如事务同时来自于本实例客户端和复制回放),所以需要扫描最后一个BINLOG文件。

生产中我们使用Xtrabackup来产生一个 从实例 的流程如下:

拉取备份,进行还原

change master to

set @@global.gtid_purged=”;

set @@global.gtid_purged=”; 的影响:

将 从实例 的ALL_GTID手工置为, 在通过GTID方式建立复制时不会出错.

将更新Binlog中记录的Previous-GTIDs (由于Binlog不可改变, 将产生新的Binlog, 记录新的Previous-GTIDs).

MySQL 5.7中set gtid_purged的行为变更

问题描述

回顾一下备份恢复的流历渣程:

拉取备份,进行还原

change master to

set @@global.gtid_purged=”;

现象: 发现有一台MySQL 5.7的Slave服务器恢复后没有产生 正确的Previous-GTIDs。

分析

分析整个过程,解决问题高烂神应该分阶段进行手动模拟发现问题。以下为详细步骤:

手工还原备份

环境

BINLOG数量,Previous-GTIDs状态

Xtrabackup 2.4.2 & MySQL 5.6    1,空    

Xtrabackup 2.4.2 & MySQL 5.7    1,空    

Xtrabackup 2.2.9 & MySQL 5.6    1,空    

Xtrabackup 2.2.9 & MySQL 5.7    1,空    

可见: 恢复过程不会轮转BINLOG。

验证change master和set gtid_purged在不同的MySQL版本中执行的差异

环境

BINLOG数量,Previous-GTIDs状态

change master & MySQL 5.6    1,空    

change master & MySQL 5.7    1,空    

set gtid_purged & MySQL 5.6    2,正常    

set gtid_purged & MySQL 5.7    1,空    

可见: 执行set gtid_purged时不同版本的MySQL产生了差异

验证

对不同版本MySQL单独执行set @@global.gtid_purged=”;语句。检查结果

环境

进行的操作

BINLOG数量,Previous-GTIDs状态

MySQL 5.7    reset master; set @@global.gtid_purged=”;    1,空    

MySQL 5.6    reset master; set @@global.gtid_purged=”;    2,正常    

结论

参考:

官方解释: 在5.7版本中,执行SET GTID_PURGED语句后binlog_simple_gtid_recovery会给GTID_PURGED计算出一个错误的值。

由于5.7中新增了存储GTID的表。所以5.7版本中set @@global.gtid_purged=”;语句被改成只修改存放GTID的表。

而5.6版本中会进行BINLOG轮转和向Previous_gtids_log_event中添加GTID。如果5.7需要产生和5.6相同结果的话,可以在SET GTID_PURGED语句后手动执行flush binary logs语句。

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

1.备份MySQL数据库的命令

mysqldump-hhostname-uusername-ppassworddatabasename>backupfile.sql

2.备份MySQL数据库为带删除表的格式,能够让该备份覆盖已有数据库而不需要手动删除原有数据库。

mysqldump-_add-drop-table-uusername-ppassworddatabasename>backupfile.sql

3.直接将MySQL数据库压缩备份

mysqldump-hhostname-uusername-ppassworddatabasename|gzip>backupfile.sql.gz

4.备份MySQL数据库某个(些)表

mysqldump-hhostname-uusername-ppassworddatabasenamespecific_table1specific_table2>backupfile.sql

5.同时备份多个MySQL数据库

mysqldump-hhostname-uusername-ppassword_databasesdatabasename1databasename2databasename3>multibackupfile.sql

6.仅仅备份灶此数据库结构

mysqldump_no-data_databasesdatabasename1databasename2databasename3>structurebackupfile.sql

7.备份服务器上所有数据库

mysqldump_all-databases>allbackupfile.sql

8.还原MySQL数据库的命令

mysql-hhostname-uusername-ppassworddatabasename

9.还隐碰迅原压缩的MySQL数据库

gunzip

10.将数据库转移到新服吵缺务器

mysqldump-uusername-ppassworddatabasename|mysql_host=*.*.*.*-Cdatabasename

c 实现数据库的备份和还原的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c 实现数据库的备份和还原,C语言实现数据库备份和还原,windows mysql几种备份和 恢复,MySQL数据库备份和还原的常用命令?的信息别忘了在本站进行查找喔。


数据运维技术 » C语言实现数据库备份和还原 (c 实现数据库的备份和还原)