Linux下c实现的数据库备份,只要修改数据库列表文件的信息即可。
db_list.txt把后缀去掉即可,一个数据库一行。
1. main.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
#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;
fp = fopen (DB_FILE, "r" );
if (!fp) {
fprintf (stderr, "%s not found\n" , DB_FILE);
}
else {
malloc_dblist();
read_num = 0;
while ( fscanf (fp, "%127[^\r\n]\n" , db_list[read_num]) == 1) {
puts (db_list[read_num]);
read_num++;
}
fclose (fp);
}
}
|
2. db_list.txt
1
2
|
admin
book
|
3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
#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;
fp = fopen (DB_FILE, "r" );
if (!fp) {
fprintf (stderr, "%s not found\n" , DB_FILE);
}
else {
malloc_dblist();
read_num = 0;
while ( fscanf (fp, "%127[^\r\n]\n" , db_list[read_num]) == 1) {
puts (db_list[read_num]);
read_num++;
}
fclose (fp);
}
}
|
以上所述就是本文的全部内容了,希望大家能够喜欢。