]>
Commit | Line | Data |
---|---|---|
a0ac57ea JP |
1 | #!/usr/bin/env php |
2 | <?php | |
3 | ||
d978d005 JP |
4 | $EXCEPTIONS = explode("\n",file_get_contents('/mit/sql/etc/db_no-daily-backup')); |
5 | $EXCEPTIONS = array_filter($EXCEPTIONS, 'strlen'); | |
a0ac57ea JP |
6 | |
7 | ini_set('memory_limit', '-1'); | |
8 | set_time_limit(0); | |
9 | ignore_user_abort(1); | |
10 | ||
11 | define('BACKUP_RUN_STATS', 0); | |
12 | define('BACKUP_CRON', 1); | |
13 | ||
d978d005 JP |
14 | $bin_mysql='mysql -umit-backup'; |
15 | $bin_mysqldump='mysqldump -umit-backup'; | |
a0ac57ea | 16 | $dump_path='/afs/athena.mit.edu/contrib/sql/backup'; |
d978d005 | 17 | $partition_path='/afs/athena.mit.edu/contrib/sql/.backup'; |
a0ac57ea | 18 | $dump_exec = "$bin_mysqldump -efqQK %s | gzip > $dump_path/%s.sql.gz "; |
4c1ceb1a | 19 | $dump_host=':/srv/mysql/mysql.sock'; |
a0ac57ea JP |
20 | $dump_user='mit-backup'; |
21 | $dump_pass=''; | |
22 | $sql_resource = mysql_connect($dump_host,$dump_user,$dump_pass); | |
23 | ||
24 | $sql_databases = mysql_list_dbs($sql_resource); | |
25 | $stat['nDatabases'] = mysql_num_rows($sql_databases); | |
26 | ||
d978d005 | 27 | @unlink("$partition_path/skipped"); |
a0ac57ea JP |
28 | while($row1 = mysql_fetch_row($sql_databases)) { |
29 | if ($row1[0] == 'information_schema') | |
30 | continue; | |
31 | if (preg_match('/[^a-z0-9\+_.-]+/i', $row1[0])) { | |
d978d005 | 32 | $f = fopen("$partition_path/skipped",'a'); |
a0ac57ea JP |
33 | fwrite($f, "{$row1[0]}\n"); |
34 | fclose($f); | |
35 | } | |
36 | $databases[$row1[0]]['name'] = $row1[0]; | |
37 | } | |
38 | ||
39 | $i_database = 1; | |
40 | $time[1][0] = microtime(true); | |
41 | foreach($databases as $name=>$info) { | |
42 | if (in_array($name, $EXCEPTIONS)) { | |
43 | if (!BACKUP_CRON) | |
d978d005 | 44 | printf("Skipping database: %s\n", $name); |
a0ac57ea | 45 | continue; |
d978d005 JP |
46 | } else { |
47 | if (!BACKUP_CRON) | |
48 | printf("Dumping database: %s\n", $name); | |
a0ac57ea JP |
49 | } |
50 | if (stristr($name,'+')) { | |
d978d005 | 51 | $owner = array_shift(explode('+',$name)); |
a0ac57ea | 52 | } else { |
d978d005 | 53 | $owner = 'root'; |
a0ac57ea | 54 | } |
f3e7245a | 55 | $ownerl = strtolower($owner); |
d978d005 | 56 | if (!is_link($dump_path.'/'.$owner)) { |
f3e7245a | 57 | symlink($partition_path.'/'.substr($ownerl,0,1).'/'.$owner, $dump_path.'/'.$owner); |
d978d005 JP |
58 | } |
59 | if (!is_dir(readlink($dump_path.'/'.$owner))) { | |
60 | mkdir(readlink($dump_path.'/'.$owner)); | |
61 | } | |
62 | `fs sa $dump_path/$owner/ system:anyuser none`; | |
63 | `fs sa $dump_path/$owner/ system:authuser none`; | |
64 | if ($owner == 'root') { | |
65 | `fs sa $dump_path/$owner/ system:sql-backup none`; | |
66 | } | |
67 | $exec = sprintf($dump_exec, $name, $owner.'/'.$name); | |
a0ac57ea JP |
68 | if (!BACKUP_CRON) |
69 | printf("Dumping %d of %d / %d%% (%s):\n", | |
70 | $i_database, | |
71 | $stat['nDatabases'], | |
72 | $i_database/$stat['nDatabases']*100, | |
73 | $name); | |
a0ac57ea JP |
74 | |
75 | $time[$name][0] = microtime(true); | |
76 | $dump_proc = popen($exec, 'r'); | |
77 | while(!feof($dump_proc)) | |
78 | echo fread($dump_proc, 1024); | |
79 | pclose($dump_proc); | |
80 | $time[$name][1] = microtime(true); | |
81 | ||
82 | if (!BACKUP_CRON) | |
83 | printf("\n"); | |
84 | ||
85 | $i_database++; | |
86 | } | |
87 | $time[1][1] = microtime(true); | |
88 | ||
89 | if (!BACKUP_CRON) | |
90 | printf("Finished.\n%s seconds.\n", $time[1][1]-$time[1][0]); | |
91 | ||
92 | ?> |