返回列表 发帖

[技术文章] mysql数据库大小限制代码

使用PHP实现的程序.花了一个下午去完成...
只是做出来让大家参考一下...献丑了....

程序思路:
一\与MYSQL数据库结合.先在MYSQL数据库另起一个库.记录数据库的库名,对应的用户名,限制的大小.等.....
二\系统检测数据库大小,然后对比记录着的资料.对比是否超过流量.如果超过流量就使用MYSQL的ROOT权.限制用户对该数据库的权限...(删除UPDATE\INST..等)
三\如果达到80%.就向管理员\用户各发送一个EMAIL通知..
四\前台程序控制数据库资料的整理...

系统分二个部份.

第一部份.是系统定时检测数据库大小,再根据检测结果与数据库资料.判断数据库是否超大....该部份操作需要有MYSQL高权限用户去完成(建议ROOT).用该文件需要定时运行.,但该文件可以放在网站访问不到的保密地方...

  1. <?php//设置部分$id=mysql_connect('localhost','user','password');  //最好是使用root,或者高权限用户
  2. //FUN部份function PMA_backquote($a_name, $do_it = TRUE)  // 取自phpmyadmin,用来格式化数据库名{      if ($do_it        && !empty($a_name) && $a_name != '*') {
  3.         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

  4. 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;}
  5. function warning($name,$email)  //超过80%时通知用户{      $admin_email='[email]admin@admin.com[/email]';    //管理员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;}

  6. //以下一段内容来自phpMyAdmin的查询每个数据库大小的程序$dbs    = mysql_list_dbs() ;while ($a_db = mysql_fetch_object($dbs)) {      //查询数据名,以后一段代码来自phpmyadmin      $dblist[] = $a_db->Database;} // end whilemysql_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
  7.    // Gets the tables stats per database   for ($i = 0; $i < $num_dbs; $i++) {      $db      = $dblist[$i];      $tables    = mysql_list_tables($db);
  8.       // 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];
  9.       // 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
  10.       $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数据库名可自由更改。但需要与其它程序保持一致
  11. 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);?>
复制代码

第二部份为前台管理系统.
这只是最简单的作品.请大家尽快做一个更好的前台出来..
main.php

  1. <?//Bendy 的mysql限额前台程序$admin='';session_start();require ("./config.php");if ($adpass==$adminpass){      $admin='ok';      session_register ("admin");$admin='ok';}      if ($admin==''){      ?><html><head><title>管理</title><meta http-equiv="Content-Type" content="text/html; charset=gb2312"></head><body>      <form  method="post" action="main.php">      请先登陆,管理密码是:<input type='text' name="adpass">      <input type="submit" name="Submit" value="进入">      </form></body></html>      <?      exit;}?><frameset rows="15%,*" frameborder="NO" border="0" framespacing="0">  <frame src="./menu.html" name="topFrame" >  <frame src="./list.php" name="main"></frameset>
复制代码

add.php

  1. <?//Bendy 的mysql限额前台程序$admin='';session_start();require ("./config.php");if ($admin==''){      echo '<a href="main.php">login first</a>';      exit;}if ($db_name!=''){      $id=mysql_connect("localhost",$user,$pass);      mysql_select_db('db_limit',$id);      $query="insert into dbs values ('$db_name','$db_user','$email','$db_limit','','')";      $result=mysql_query($query);      echo "insert success ";      mysql_close($id);}      ?><html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><title>添加用户到数据库</title></head><body><p>添加用户到数据库</p><form  method="post" action="add.php">数据库名:<input type="text" name="db_name"><br>用户名:<input type='text' name="db_user"><br>限制的大小:<input type='text' name="db_limit">字节<BR>通知的EMAIL:<input type='text' name="email"><BR><input type="submit" name="Submit" value="添加"></form></body></html>
复制代码

config.php

  1. <?//Bendy 的mysql限额前台程序$user="root";     //该用户只需要对系统的db_limit数据库有访问权.不需要ROOT权$pass="123654";    //密码$adminpass="bendy"; //进入前台的管理密码?>
复制代码

list.php

  1. <?//Bendy 的mysql限额前台程序$admin='';session_start();require ("./config.php");if ($admin==''){      echo '<a href="main.php">login first</a>';      exit;}$id=mysql_connect("localhost",$user,$pass);mysql_select_db('db_limit',$id);?><html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><title>list</title></head><body><table width="100%" border="2" >  <tr>   <td width="15%" height="21">数据库名</td>   <td width="15%">用户名</td>   <td width="15%">限额</td>   <td width="15%">已用</td>   <td width="10%">EMAIL</td>   <td width="10%">限制</td>   <td width="10%">修改</td>   <td width="10%">删除</td>  </tr><?$query="select * from dbs";$result=mysql_query($query);while ($list=mysql_fetch_array($result)){      if ($list['db_has_limit']=='1')       {$limit='<a href=./fix.php?dbname='.$list[db_name].'><font color=red>是|重开</font></a>';} //change for fix.php      else       {$limit='否';}      echo "<tr><td>$list[db_name]</td><td>$list[db_user]</td><td>$list[db_limit_size]</td><td>$list[db_size_used]</td><td>$list[db_email]</td><td>$limit</td><td><a href=edit.php?dbname=$list[db_name]>修改</a></td><td><a href=del.php?dbname=$list[db_name]>删除</a></td><tr>";}?></table></body></html>
复制代码

edit.php

  1. <?//Bendy 的mysql限额前台程序$admin='';session_start();require ("./config.php");if ($admin==''){      echo '<a href="main.php">login first</a>';      exit;}$id=mysql_connect("localhost",$user,$pass);mysql_select_db('db_limit',$id);if ($dbname==''){      echo "edit what? goto <a href=list.php> list </a>";      exit;}if ($submit!=''){      $query="update dbs set db_user='$dbuser',db_limit_size='$limit',db_email='$email' ,db_has_limit='0' where db_name='$dbname'";      $result=mysql_query($query);      echo "edit success? goto <a href=list.php> list </a>";      exit;}      $query="select * from dbs where db_name='$dbname'";$result=mysql_query($query);$edit=mysql_fetch_array($result);?>
  2. <form  method="post" action="edit.php">数据库名:<?=$dbname?><br>用户名:<input type='text' name="dbuser" value="<?=$edit[db_user]?> "><br>限制的大小:<input type='text' name="limit" value="<?=$edit[db_limit_size]?>">字节<BR>通知的EMAIL:<input type='text' name="email" value="<?=$edit[db_email]?> " ><BR><input type='hidden' name="dbname" value="<?=$dbname?>"><input type="submit" name="submit" value="更改"></form></body></html>
复制代码

del.php

  1. <?$admin='';session_start();require ("./config.php");if ($admin==''){      echo '<a href="main.php">login first</a>';      exit;}$id=mysql_connect("localhost",$user,$pass);mysql_select_db('db_limit',$id);if ($dbname==''){      header("location:list.php");       exit;}$query="delete from dbs where db_name='$dbname'";$result=mysql_query($query);echo "delete success ,goto <a href=list.php> list </a>";?>
复制代码


还有!!!
在MYSQL中建立一个
db_limit
的数据库.
导入以下内容

  1. # database : `db_limit`CREATE TABLE `dbs` (  `db_name` varchar(64) NOT NULL default '',  `db_user` varchar(64) NOT NULL default '',  `db_email` varchar(64) NOT NULL default '',  `db_limit_size` int(10) NOT NULL default '0',  `db_has_limit` int(10) NOT NULL default '0',  `db_size_used` int(10) NOT NULL default '0') TYPE=MyISAM;
复制代码


MENU.html

  1. <html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><title>menu</title></head>
  2. <body><table width="100%" border="5">  <tr>    <td><div align="center"><a href="./list.php" target="main">列表</a></div></td>   <td><div align="center"><a href="./add.php" target="main">添加</a></div></td>  </tr></table></body></html>
复制代码
欢迎光临:逐梦论坛

返回列表

Powered by Discuz! 7.2   论坛QQ群:逐梦论坛群

© 2001-2021 Comsenz Inc. 鲁公网安备 37120302000001号