使用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文件内容:

  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. //待备份的数据表文件(一个数据库一行)
  10. #define DB_FILE "./db_list"
  11. //最多可以备份的数据库数量
  12. #define NUM 20
  13. //一个数据库名字的最长字符数
  14. #define LEN 128
  15. //保存从DB_FILE中读取到的数据库
  16. char *db_list[NUM];
  17. //从DB_FILE文件中读取到的数据库数量
  18. int read_num;
  19. //请求内存函数
  20. void malloc_dblist();
  21. //释放内存函数
  22. void free_dblist();
  23. //读取数据库文件
  24. void readDbFile();
  25.  
  26. int main(int argc, char *argv[]) {
  27. pid_t pid;
  28. int i;
  29. char buf[LEN];
  30.  
  31. //从文件读取数据库信息
  32. readDbFile();
  33.  
  34. pid = fork();
  35.  
  36. if (pid < 0) {
  37. fprintf(stderr, "fork error\n");
  38. exit(1);
  39. }
  40.  
  41. switch (pid) {
  42. case -1:
  43. fprintf(stderr, "fork failed\n");
  44. exit(1);
  45. case 0:
  46. //子进程进行数据库的备份
  47. for (i = 0; i < read_num; i++) {
  48. memset(buf, '\0', LEN);
  49. sprintf(buf, "%s%s%s%s%s", "mysqldump -uroot ", db_list[i], " > ", db_list[i], ".sql");
  50. system(buf);
  51. printf("%d,%s\n", i, buf);
  52. }
  53. break;
  54. }
  55. //等待子进程的结束
  56. if (pid > 0) {
  57. int stat_val;
  58. pid_t child_pid;
  59.  
  60. child_pid = wait(&stat_val);
  61.  
  62. if (!WIFEXITED(stat_val)) {
  63. fprintf(stdout, "Child terminated abnormaly\n");
  64. }
  65. exit(1);
  66.  
  67. }
  68.  
  69. free_dblist();
  70.  
  71. exit(0);
  72.  
  73. }
  74.  
  75. void malloc_dblist()
  76. {
  77. int i = 0;
  78. //malloc for db_list
  79. for (i = 0; i < NUM; i++) {
  80. db_list[i] = malloc(LEN);
  81. memset(db_list[i], '\0', LEN);
  82. }
  83. }
  84. void free_dblist()
  85. {
  86. int i;
  87. //free db_list's memory
  88. for (i = 0; i < NUM; i++) {
  89. free(db_list[i]);
  90. }
  91. }
  92.  
  93. void readDbFile()
  94. {
  95. FILE *fp;
  96. int i, j, c, isnewline;
  97. char *rs;
  98. char tmpbuf[LEN];
  99.  
  100. fp = fopen(DB_FILE, "r");
  101. if (!fp) {
  102. fprintf(stderr, "%s not found\n", DB_FILE);
  103. }
  104. else {
  105. malloc_dblist();
  106.  
  107. read_num = 1;
  108. j = 0;
  109. isnewline = 0;
  110. while (!feof(fp)) {
  111. c = fgetc(fp);
  112. //空字符或者字符串结束字符
  113. if (c == ' ' || c == '\0') {
  114. continue;
  115. }
  116. //回车字符
  117. if (c == '\r') {
  118. continue;
  119. }
  120. //换行字符
  121. if (c == '\n') {
  122. j = 0;
  123. isnewline = 1;
  124. continue;
  125. }
  126. //不可打印字符
  127. if (!isprint(c)) {
  128. continue;
  129. }
  130. if (isnewline) {
  131. read_num++;
  132. isnewline = 0;
  133. }
  134. db_list[read_num-1][j] = c;
  135. j++;
  136. }
  137.  
  138. fclose(fp);
  139. }
  140.  
  141. }

  

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

  1. admin
  2. 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. poj 1789 Truck History【最小生成树prime】

    Truck History Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 21518   Accepted: 8367 De ...

  2. mysql创建数据库(指定编码)

    如下脚本创建数据库yourdbname,并制定默认的字符集是utf8. CREATE DATABASE IF NOT EXISTS yourdbname DEFAULT CHARSET utf8 CO ...

  3. 来看看Github上流行的编码规范

      Popular Coding Convention on Github是一个有趣的网站,它根据Github的代码提交情况分析了几种语言流行的代码规范,目前支持对JavaScript,Java,Py ...

  4. “发送至Onenote”惹来的小麻烦(转)

    原文来自 :  http://blog.csdn.net/yiyu_0417/article/details/7864172 [看到这篇文章,我觉得以后我也会遇到这个问题,很有价值我就先拷贝了,留着以 ...

  5. MapObject shape数据操作

    利用MO 的GeoDataset  .DataConnection  Recordset 进行数据操作 在MO中.使用GeoDataset对象和DataConnection 对象来连接和读取地理数据. ...

  6. C# SQL多条件查询拼接技巧

    本文转载:http://blog.csdn.net/limlimlim/article/details/8638080 #region 多条件搜索时,使用List集合来拼接条件(拼接Sql) Stri ...

  7. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(32)-swfupload多文件上传[附源码]

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(32)-swfupload多文件上传[附源码] 文件上传这东西说到底有时候很痛,原来的asp.net服务器 ...

  8. delphi TOpenDialog

        TOpenDialog     procedure TForm1.Button1Click(Sender: TObject);begin  with TOpenDialog.Create(ni ...

  9. Linux多线程——使用互斥量同步线程

    前文再续,书接上一回,在上一篇文章: Linux多线程——使用信号量同步线程中,我们留下了一个如何使用互斥量来进行线程同步的问题,本文将会给出互斥量的详细解说,并用一个互斥量解决上一篇文章中,要使用两 ...

  10. 计算机体系结构 -内存优化vm+oom

    http://www.cnblogs.com/dkblog/archive/2011/09/06/2168721.htmlhttps://www.kernel.org/doc/Documentatio ...