使用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

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

  1. linux c数据库备份第二版

    #想知道更多请查看第一版"linux c数据库备份第一版" #include<sys/types.h> #include<sys/wait.h> #incl ...

  2. linux c数据库备份第四版

    该版本算是比较成熟的啦,欢迎大伙拿来试用!!!1.新增数据库连接和备份时间配置文件conf2.新增日志文件,程序运行的一些异常会记录在log文件下 后续的工作:1.将代码切割为多个文件,分类存放代码2 ...

  3. linux c数据库备份第五版

    linux下c实现的数据库备份程序终于迎来第五版啦,这样改程序就暂告一段落啦,有点小激动呢...接下来的一周(可能两周)时间里,我会用一个小型的网络游戏(比拼99乘法)作为我学习linux c的毕业之 ...

  4. Linux下数据库备份

    1.登录数据库服务器并切换到数据库用户下 [root@*** ~]# su - oracle 2.测试用户名密码是否能正确连接数据库 [oracle@*** ~]$ sqlplus username/ ...

  5. linux c数据库备份第三版

    这个版本相对第一版更新了很多,其实我本地定义为第五版的.相对第一版主要更新内容:1.增加了定时器2.用户可以停止调备份程序3.如果备份程序正在运行,那么尝试运行提示已经在运行4.记录程序运行时的pid ...

  6. Linux下数据库备份恢复过程

    1. 远程进入Linux服务器. 2. 一般登录的是root用户, 第一步切换到Oracle用户, 命令: su - oracle 3. 查看服务器上面数据库的监听的状况 lsnrctl 之后输入命令 ...

  7. Linux oracle数据库自动备份自动压缩脚本代码

    Linux oracle数据库备份完成后可以自动压缩脚本代码. 复制代码代码如下: #!/bin/bash #backup.sh #edit: www.jbxue.com ##系统名称 sysname ...

  8. Linux下mysql备份 恢复

    转载自http://blog.chinaunix.net/uid-20577907-id-161611.html 比如我们要备份mysql中已经存在的名为linux的数据库,要用到命令mysqldum ...

  9. linux自动定时备份web程序和mysql数据库

    前些天受朋友说linux定时备份不知道怎么搞,叫帮忙处理一下.由于这段时间正闲着,所以也就欣然答应.由于朋友对linux不懂也希望我将操作的过程记录下来,也就是越详细越好.所以写得比较$%^& ...

随机推荐

  1. 从m个数中取top n

    将题目具体一点,例如,从100个数中取出从大到小排前10的数 方法1:使用快速排序 因为快速排序一趟下来,小于K的数都在K的前面,大于K的数都在K的后面 如果,小于K的数有35个,大于K的数有64个 ...

  2. 详解C#中System.IO.File类和System.IO.FileInfo类的用法

    System.IO.File类和System.IO.FileInfo类主要提供有关文件的各种操作,在使用时需要引用System.IO命名空间.下面通过程序实例来介绍其主要属性和方法. (1) 文件打开 ...

  3. 深入解析Java中volatile关键字的作用

    转(http://m.jb51.net/article/41185.htm)Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制 在java线 ...

  4. TPL中的task并不是thread

    Tasks are not Threads - The Brain Dump用了一个非常简单直观的例子说明了task和thread并不是一回事(尽管你调用Task.Run一般会在线程池上启一个线程帮你 ...

  5. Java 多线程并发 Future+callable 实例

    需求:一个业务实现 查询, 因为 要查询十几次, 所以每个平均0.6秒, 之前只有主线程一步步查 ,结果用了10秒,效率十分低下 , 于是改用线程池并发: 以下是代码设计: 1.线程池工具类: pac ...

  6. UIApplication对象及其代理UIApplicationDelegate[转]

    在开发过程中我们需要一些全局对象来将程序的各个部分连接起来,这些全局对象中最重要的就是UIApplication对象.但在实际编程中我们并不直接和UIApplication对象打交道,而是和其代理打交 ...

  7. 利用NPOI开源的读写Excel、WORD等微软OLE2组件读写execl,控制样式或单元格

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  8. android 38 Abdroid客户端和服务端交互

    服务端: package com.sxt.day05; import java.io.IOException; import java.util.ArrayList; import javax.ser ...

  9. WWDC-UIKit 中协议与值类型编程实战

    本文为 WWDC 2016 Session 419 的部分内容笔记.强烈推荐观看. 设计师来需求了 在我们的 App 中,通常需要自定义一些视图.例如下图: 我们可能会在很多地方用到右边为内容,左边有 ...

  10. jQuery日期联动插件

    此版本为网上的日期联动插件修改版,加入了修改后事件 /* * jQuery Date Selector Plugin * 日期联动选择插件 * * Demo: $("#calendar&qu ...