使用PHP实现的程序.花了一个下午去完成...
只是做出来让大家参考一下...献丑了....
程序思路:
一\与MYSQL数据库结合.先在MYSQL数据库另起一个库.记录数据库的库名,对应的用户名,限制的大小.等.....
二\系统检测数据库大小,然后对比记录着的资料.对比是否超过流量.如果超过流量就使用MYSQL的ROOT权.限制用户对该数据库的权限...(删除UPDATE\INST..等)
三\如果达到80%.就向管理员\用户各发送一个EMAIL通知..
四\前台程序控制数据库资料的整理...
系统分二个部份.
第一部份.是系统定时检测数据库大小,再根据检测结果与数据库资料.判断数据库是否超大....该部份操作需要有MYSQL高权限用户去完成(建议ROOT).用该文件需要定时运行.,但该文件可以放在网站访问不到的保密地方...
所有文件.打包下载.
http://www.xingkong.biz/mysql_limit.zip
- <?php
- //设置部分
- $id=mysql_connect('localhost','user','password'); //最好是使用root,或者高权限用户
- //FUN部份
- function PMA_backquote($a_name, $do_it = TRUE) // 取自phpmyadmin,用来格式化数据库名
- {
- if ($do_it
- && !empty($a_name) && $a_name != '*') {
- if (is_array($a_name)) {
- $result = array();
- reset($a_name);
- while(list($key, $val) = each($a_name)) {
- $result[$key] = '`' . $val . '`';
- }
- return $result;
- } else {
- return '`' . $a_name . '`';
- }
- } else {
- return $a_name;
- }
- } // end of the 'PMA_backquote()' function
- function limit($user,$db) //达到限制限制用户权限后运行的程序
- {
- $query='REVOKE INSERT ,UPDATE ,CREATE ON "'.$db.'".* FROM "'.$user.'@localhost';//将insert update create的权限移走。01/17修正大BUG
- $result = @mysql_query($query);//changed! only 1 query....
- //相应的权限代码可以再更改.
- //echo 'lim.debug';exit;
- }
- function warning($name,$email) //超过80%时通知用户
- {
- $admin_email='admin@admin.com'; //管理员EMAIL地址。请更改
- $message='MYSQL用户:'.$name.'的数据库已超过系统允许的大小的80% /n 请及时整理数据'; //通知的内容可以更改
- @mail($admin_email,'MYSQL报告',$message,'from:mysql@admin.com');
- @mail($email,'MYSQL大小警告',$message,'from:mysql@admin.com');
- //echo 'warning.debug';exit;
- }
- //以下一段内容来自phpMyAdmin的查询每个数据库大小的程序
- $dbs = mysql_list_dbs() ;
- while ($a_db = mysql_fetch_object($dbs)) { //查询数据名,以后一段代码来自phpmyadmin
- $dblist[] = $a_db->Database;
- } // end while
- mysql_free_result($dbs);
- $num_dbs = count($dblist);
- $total_array[0] = 0; // number of tables
- $total_array[1] = 0; // total data size
- $total_array[2] = 0; // total index size
- $total_array[3] = 0; // big total size
- // Gets the tables stats per database
- for ($i = 0; $i < $num_dbs; $i++) {
- $db = $dblist[$i];
- $tables = mysql_list_tables($db);
- // Number of tables
- if ($tables) {
- $dbs_array[$db][0] = mysql_numrows($tables);
- mysql_free_result($tables);
- } else {
- $dbs_array[$db][0] = 0;
- }
- $total_array[0] += $dbs_array[$db][0];
- // Size of data and indexes
- $dbs_array[$db][1] = 0; // data size column
- $dbs_array[$db][2] = 0; // index size column
- $dbs_array[$db][3] = 0; // full size column
- $local_query = 'SHOW TABLE STATUS FROM ' . PMA_backquote($db);
- //echo $db;
- $result = @mysql_query($local_query);
- // needs the "@" below otherwise, warnings in case of special DB names
- if ($result ) {
- while ($row = mysql_fetch_array($result)) {
- $dbs_array[$db][1] += $row['Data_length'];
- $dbs_array[$db][2] += $row['Index_length'];
- }
- $dbs_array[$db][3] = $dbs_array[$db][1] + $dbs_array[$db][2];
- $total_array[1] += $dbs_array[$db][1];
- $total_array[2] += $dbs_array[$db][2];
- $total_array[3] += $dbs_array[$db][3];
- // echo $dbs_array[$db][3]."<br>";
- mysql_free_result($result);
- } // end if
- } // end for
- //查询数据库完毕。
-
-
- //以下代码用来判断数据库大小是否达到限制等。。。。
- mysql_select_db('db_limit',$id); //db_limit数据库名可自由更改。但需要与其它程序保持一致
- for ($i = 0; $i < $num_dbs; $i++) {
- $db=$dblist[$i];
- $query='select * from dbs where db_name="'.$db.'"';
- $result=mysql_query($query);
- if ($result)
- {
- $dbs_limit=mysql_fetch_array($result);
- $limit_size=$dbs_limit['db_limit_size'];
- $user=$dbs_limit['db_user'];
- $limited=$dbs_limit['db_has_limit'];
- $used_size=$dbs_limit['db_size_used'];
- $email=$dbs_limit['db_email'];
- $warning_size=$limit_size*0.8; //0.8=80%,你可以更改为其它比例
- if ($user!=''){ //这
- if ($dbs_array[$db][3] > $limit_size) {limit($user,$db);$limited='1';}
- if ($dbs_array[$db][3] > $warning_size) warning($user,$email);
- $query='update dbs set db_has_limit="'.$limited.'" , db_size_used="'.$dbs_array[$db][3].'" where db_name="'.$db.'"';
- $result=mysql_query($query); //更新数据库大小至数据资料库
- }
- //echo $query;exit;
- }
- }
- mysql_close($id);
- //欢迎大家加以修改。但改完后。请到https://discuz.dismall.com/forumdisplay.php?fid=34发表修改结果
- ?>
复制代码
[ Last edited by BENDY on 2004-1-17 at 11:19 AM ] |