linux c数据库备份第一版

使用linuxC实现的mysql数据库备份
目标:通过alarm信号定时备份数据库
备注:目前是第一个版,本身不能定时备份可以结合linux自动化实现定时备份。
运行平台:Linux或类unix
测试平台:ubuntu server 14.04 x64
文件信息:
main.c:数据库备份程序
db_list:待备份的数据库信息,一行一个文件。
不足:
文件的读取方式感觉还不到位,使用的是fgetc一个个字符读取然后过滤和组合来读取相关的数据库信息;开始使用的是fgets函数处理的时候,遇到了很多的麻烦,比如读取到回车字符\r,读取到换行字符\n,读取到不可见字符等,后面信心大受伤所以改用了fgetc实现了。目前测试还是挺良好的,也欢迎大家提出更好的解决方案。(注:昨晚已经使用fscanf函数解决了这个问题,晚点会更新上来)

编译和运行:
首先把要备份的数据库名写进db_list文件里面一行一个数据库,如
admin
book
然后编译和运行
$gcc -o mian main.c
$./main

下面是main.c文件内容:

#include<sys/types.h>
#include<sys/wait.h>
#include<ctype.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>

//待备份的数据表文件(一个数据库一行)
#define DB_FILE "./db_list"
//最多可以备份的数据库数量
#define NUM 20
//一个数据库名字的最长字符数
#define LEN 128
//保存从DB_FILE中读取到的数据库
char *db_list[NUM];
//从DB_FILE文件中读取到的数据库数量
int read_num;
//请求内存函数
void malloc_dblist();
//释放内存函数
void free_dblist();
//读取数据库文件
void readDbFile();

int main(int argc, char *argv[]) {
	pid_t pid;
	int i;
	char buf[LEN];

	//从文件读取数据库信息
	readDbFile();

	pid = fork();

	if (pid < 0) {
		fprintf(stderr, "fork error\n");
		exit(1);
	}

	switch (pid) {
		case -1:
			fprintf(stderr, "fork failed\n");
			exit(1);
		case 0:
			//子进程进行数据库的备份
			for (i = 0; i < read_num; i++) {
				memset(buf, ‘\0‘, LEN);
				sprintf(buf, "%s%s%s%s%s", "mysqldump -uroot ", db_list[i], " > ", db_list[i], ".sql");
				system(buf);
				printf("%d,%s\n", i, buf);
			}
			break;
	}
	//等待子进程的结束
	if (pid > 0) {
		int stat_val;
		pid_t child_pid;

		child_pid = wait(&stat_val);

		if (!WIFEXITED(stat_val)) {
			fprintf(stdout, "Child terminated abnormaly\n");
		}
		exit(1);

	}

	free_dblist();

	exit(0);

}

void malloc_dblist()
{
	int i = 0;
	//malloc for db_list
	for (i = 0; i < NUM; i++) {
		db_list[i] = malloc(LEN);
		memset(db_list[i], ‘\0‘, LEN);
	}
}
void free_dblist()
{
	int i;
	//free db_list‘s memory
	for (i = 0; i < NUM; i++) {
		free(db_list[i]);
	}
}

void readDbFile()
{
	FILE *fp;
	int i, j, c, isnewline;
	char *rs;
	char tmpbuf[LEN];

	fp = fopen(DB_FILE, "r");
	if (!fp) {
		fprintf(stderr, "%s not found\n", DB_FILE);
	}
	else {
		malloc_dblist();

		read_num = 1;
		j = 0;
		isnewline = 0;
		while (!feof(fp)) {
			c = fgetc(fp);
			//空字符或者字符串结束字符
			if (c == ‘ ‘ || c == ‘\0‘) {
				continue;
			}
			//回车字符
			if (c == ‘\r‘) {
				continue;
			}
			//换行字符
			if (c == ‘\n‘) {
				j = 0;
				isnewline = 1;
				continue;
			}
			//不可打印字符
			if (!isprint(c)) {
				continue;
			}
			if (isnewline) {
				read_num++;
				isnewline = 0;
			}
			db_list[read_num-1][j] = c;
			j++;
		}

		fclose(fp);
	}

}

  

下面是数据库信息文件db_list:

admin
book
时间: 2024-10-26 16:34:24

linux c数据库备份第一版的相关文章

linux c数据库备份第二版

#想知道更多请查看第一版"linux c数据库备份第一版" 1 #include<sys/types.h> 2 #include<sys/wait.h> 3 #include<ctype.h> 4 #include<unistd.h> 5 #include<string.h> 6 #include<stdlib.h> 7 #include<stdio.h> 8 9 //待备份的数据表文件(一个数据库一行

linux c数据库备份第五版

linux下c实现的数据库备份程序终于迎来第五版啦,这样改程序就暂告一段落啦,有点小激动呢...接下来的一周(可能两周)时间里,我会用一个小型的网络游戏(比拼99乘法)作为我学习linux c的毕业之作...后面接着就是选条路走了“linux网络大数据开发”或者“基于linux的微型系统”了...欢迎各位linux c爱好者私信交流... 在发布上个版本的时候说在这个版会加入开启自动和自动后台运行的,后面有网友提出建议和自己考虑之后就觉得没有必要做这个两件事情啦... 该版本和上一个版本的的功能

linux c数据库备份第三版

这个版本相对第一版更新了很多,其实我本地定义为第五版的.相对第一版主要更新内容:1.增加了定时器2.用户可以停止调备份程序3.如果备份程序正在运行,那么尝试运行提示已经在运行4.记录程序运行时的pid信息5.支持** start;** restart;** stop等命令还有其他细节的更新.不足:restart的支持还不是很完美,因为没有考虑到服务器繁忙等情况. 运行示例:编译:gcc -o main main.c运行:./main重启./main restart关闭./main stop #i

linux下c实现的数据库备份(第四版)

该版本算是比较成熟的啦,欢迎大伙拿来试用!!!1.新增数据库连接和备份时间配置文件conf2.新增日志文件,程序运行的一些异常会记录在log文件下 后续的工作:1.将代码切割为多个文件,分类存放代码2.加入自动后台运行的支持3.加入开机自动运行的支持完成上面3个之后,我的linux c数据库备份程序就暂时靠一段落了. 使用提醒:编译:gcc -o main main.c后台启动:./main &停止程序:./main stop #include<sys/types.h> #includ

Linux下mysql备份 恢复

转载自http://blog.chinaunix.net/uid-20577907-id-161611.html 比如我们要备份mysql中已经存在的名为linux的数据库,要用到命令mysqldump 命令格式如下: [[email protected] root]# mysqldump -u root -p linux > /root/linux.sql Enter password:在这里输入数据库的密码 通过上面的命令,我们要明白两件事,首先备份数据库是要以数据库管理员的身份备份:其次:

Linux下定时备份MySQL数据库的Shell脚本

Linux下定时备份MySQL数据库的Shell脚本 对任何一个已经上线的网站站点来说,数据备份都是必须的.无论版本更新还是服务器迁移,备份数据的重要性不言而喻.人工备份数据的方式不单耗费大量时间和精力,还灰常不专业的说.于是,有了下面这段脚本的出现.参考了网上的很多教程,外加自己的测试,以下脚本经测试可用.#!/bin/bash#Shell Command For Backup MySQL Database Everyday Automatically By Crontab#Author :

Linux VPS主机备份数据库的4个方法

从虚拟主机过度到VPS之后,一般的站长可能会感觉到运维时间成本还是比较大的.比如在VPS维护.备份数据方面,在没有使用定期自动备份功能的软件时基本都是用手工备份的.对于网页文件,我们可以通过压缩打包FTP下载的方式搞定,但是MYSQL数据库的备份需要格外的小心,一旦备份失误缺失,然后真需要还原恢复的时候可能会造成很大的损失. 下面给大家整理一些比较常用的Linux VPS主机备份MySQL数据库的方式: 第一.PHPMYADMIN导出方法 不论我们使用的是WEB面板,还是使用一键包,应该都会有安

Linux 每天自动备份mysql数据库的方法

Linux 每天自动备份mysql数据库的方法 作者: 字体:[增加 减小] 类型:转载 linux下为了安全有时候需要自动备份mysql数据库,下面是具体的实现步骤. /usr/bin为mysql安装目录 建备份文件夹: mkdir mysql_data_bak 建脚本文件: touch autobackupmysql.sh 打开文件 vi autobackupmysql.sh 在脚本中加入如下内容: filename=`date +%Y%m%d` /usr/bin/mysqldump -op

在Linux上Oracle数据库进行数据库备份报ORA-39029和ORA-31671

在Linux上Oracle数据库进行数据库备份执行命令: expdp 用户名/密码@ip:端口/服务 directory=DATA_PUMP_DIR dumpfile=文件名.dmp full=y; 之后报: ORA-39029: worker 1 with process name "DW0E" prematurely terminatedORA-31671: Worker process DW0E had an unhandled exception.ORA-00028: your