终于做好了.欢迎大家评一评!<mysql数据库大小的限制>

发表于:2007-07-04来源:作者:点击数: 标签:
终于做好了.欢迎大家评一评!my sql数据库 大小的限制 终于做好了.欢迎大家评一评! mysql数据库 大小的限制 使用 PHP 实现的程序.花了一个下午去完成... 只是做出来让大家参考一下...献丑了.... 程序思路: 一\与MY SQL 数据库结合.先在MYSQL数据库另起一个库.
终于做好了.欢迎大家评一评!<mysql数据库大小的限制>

终于做好了.欢迎大家评一评!<mysql数据库大小的限制>

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

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


系统分二个部份.

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


所有文件.打包下载.
http://www.xingkong.biz/mysql_limit.zip

  CODE:[Copy to clipboard]  
clearcase/" target="_blank" >cc3" border="0">
<?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)
                        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);
//欢迎大家加以修改。但改完后。请到http://www.discuz.net/forumdisplay.php?fid=34发表修改结果
?>
第二部份为前台管理系统.
这只是最简单的作品.请大家尽快做一个更好的前台出来..

main.php

  CODE:[Copy to clipboard]  
<?
//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

  CODE:[Copy to clipboard]  
<?
//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

  CODE:[Copy to clipboard]  
<?
//Bendy 的mysql限额前台程序
$user="root";       //该用户只需要对系统的db_limit数据库有访问权.不需要ROOT权
$pass="123654";     //密码
$adminpass="bendy"; //进入前台的管理密码
?>
list.php

  CODE:[Copy to clipboard]  
<?
//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
       
        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

  CODE:[Copy to clipboard]  
<?
//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);
?>

<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

  CODE:[Copy to clipboard]  
<?
$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
的数据库.
导入以下内容

  CODE:[Copy to clipboard]  
# 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

  CODE:[Copy to clipboard]  
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>menu</title>
</head>

<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>
  QUOTE:
引用自uplinux
就算利用 php 来写检测,也仍然可以实现自动运行的。
crobtab

* 0 * * * /usr/lcoal/php4/bin/php  /home/master/mysql.php

将本系统的脚本放在一个安全的地方.(如果可以让网页访问.也可以,这样的好处是用户可以随时更新信息)

每天0点执行这个php脚本,PHP 文件中想怎么写就怎么写了。
加一个程序

init.php快速建立数据库资料系统


  CODE:[Copy to clipboard]  
<?php
//初始数据库系统,使用本程序。可以快速建立本地用户系统资料库。
//暂时只能快速建立数据库名=用户名的系统。有意者。可以建立数据库名与用户名不同的资料库。。。。。

$id=mysql_connect('localhost','user','password');   //最好是使用root,或者高权限用户
$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);
mysql_select_db('db_limit',$id);
$init_size='100000000';                           //初始限制大小(字节数)
for ($i = 0; $i < $num_dbs; $i++) {
        $query="insert into dbs values ('$dblist[$i]','$dblist[$i]','','$init_size','','')";
        $result=mysql_query($query);       
}
mysql_close($id);
?>

补充一个....恢复用户权限..

  CODE:[Copy to clipboard]  
<?
$admin='';session_start();
require ("./config.php");
if ($admin=='')
{
        echo '<a href="main.php">login first</a>';
        exit;
}
$id=mysql_connect("localhost",'root','rootpass');   //这里需要ROOT权限!!!
mysql_select_db('db_limit',$id);
if ($dbname=='')
{
        header("location:list.php");
        exit;
}
$query="select * from dbs where db_name='$dbname'";
$result=mysql_query($query);
$fix=mysql_fetch_array($result);
$query='GRANT INSERT ,UPDATE ,CREATE  ON "'.$fix[db_name].'".* TO "'.$fix[db_name].'@localhost';
$result=mysql_query($query);
$query="update dbs set db_has_limit=0 where db_name=$fix[db_name]";
$result=mysql_query($query);
echo "fix success ,but you must change the limit , If not ,system will limit it again! goto <a href=list.php> list </a>";
?>
Originally posted by zhnag at 2004-1-9 05:46 PM:
http://www.xingkong.biz/mysql_limit.zip

原文转自:http://www.ltesting.net