当前位置:首页 » 数据仓库 » 数据库巡检脚本
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

数据库巡检脚本

发布时间: 2022-05-31 22:24:04

① 怎么写一个脚本检查oracle数据库表空间,如果利用率超过80%,就执行一条加表空间的sql

您好
SELECT UPPER(F.TABLESPACE_NAME) "表空间名",
D.TOT_GROOTTE_MB "表空间大小(M)",
D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)",
TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),'990.99') || '%' "使用比",
F.TOTAL_BYTES "空闲空间(M)",
F.MAX_BYTES "最大块(M)"
FROM (SELECT TABLESPACE_NAME,
ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,
ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES
FROM SYS.DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F,
(SELECT DD.TABLESPACE_NAME,
ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB
FROM SYS.DBA_DATA_FILES DD
GROUP BY DD.TABLESPACE_NAME) D
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
ORDER BY 1;

② 你用什么方法检查PHP脚本的执行效率(通常是脚本执行时间)和数据库SQL的效率(通常是数据库Query时间),

一般是在你要检查的代码开头记录一个时间,结尾记录一个时间。取差值
但这个时间一般来说都很快,在一秒以内,所以不能直接用mktime(),我给你个我写的函数
function getmicrotime(){
list($usec,$sec) = explode(" ",microtime());
$num = ((float)$usec+(float)$sec);
return sprintf("%.4f",$num);
}
用法:
$t_start = getmicrotime();
//这里放你要检查的代码
$t_end = getmicrotime();
echo $t_end - $t_start;

输出的单位是秒,"%.4f"代表精确到小数点后四位,这个可以自行更改

③ 请教:mysql 运行一段时间后速度变慢问题

我们先来看第一个阶段,MySQL慢的诊断思路,一般我们会从三个方向来做:

  • 第一个方向是MySQL内部的观测

  • 第二个方向是外部资源的观测

  • 第三个方向是外部需求的改造

  • 1.1 MySQL 内部观测

    我们来看MySQL内部的观测,常用的观测手段是这样的,从上往下看,第一部分是Processlist,看一下哪个SQL压力不太正常,第二步是explain,解释一下它的执行计划,第三步我们要做Profilling,如果这个SQL能再执行一次的话, 就做一个Profilling,然后高级的DBA会直接动用performance_schema ,MySQL 5.7 以后直接动用sys_schema,sys_schema是一个视图,里面有便捷的各类信息,帮助大家来诊断性能。再高级一点,我们会动用innodb_metrics进行一个对引擎的诊断。

    除了这些手段以外,大家还提出了一些乱七八糟的手段,我就不列在这了,这些是常规的一个MySQL的内部的状态观测的思路。除了这些以外,MySQL还陆陆续续提供了一些暴露自己状态的方案,但是这些方案并没有在实践中形成套路,原因是学习成本比较高。

    1.2 外部资源观测

    外部资源观测这部分,我引用了一篇文章,这篇文章的二维码我贴在上面了。这篇文章是国外的一个神写的,标题是:60秒的快速巡检,我们来看一下它在60秒之内对服务器到底做了一个什么样的巡检。一共十条命令,这是前五条,我们一条一条来看。

    1.uptime,uptime告诉我们这个机器活了多久,以及它的平均的负载是多少。

    2.dmesg -T | tail,告诉我们系统日志里边有没有什么报错。

    3.vmstat 1,告诉我们虚拟内存的状态,页的换进换出有没有问题,swap有没有使用。

    4. mpstat -P ALL,告诉我们CPU压力在各个核上是不是均匀的。

    5.pidstat 1,告诉我们各个进程的对资源的占用大概是什么样子。

    我们来看一下后五条:

    首先是iostat-xz 1,查看IO的问题,然后是free-m内存使用率,之后两个sar,按设备网卡设备的维度,看一下网络的消耗状态,以及总体看TCP的使用率和错误率是多少。最后一条命令top,看一下大概的进程和线程的问题。

    这个就是对于外部资源的诊断,这十条命令揭示了应该去诊断哪些外部资源。

    1.3 外部需求改造

    第三个诊断思路是外部的需求改造,我在这里引用了一篇文档,这篇文档是MySQL的官方文档中的一章,这一章叫Examples of Common Queries,文档中介绍了常规的SQL怎么写, 给出了一些例子。文章的链接二维码在slide上。

    我们来看一下它其中提到的一个例子。

    它做的事情是从一个表里边去选取,这张表有三列,article、dealer、price,选取每个作者的最贵的商品列在结果集中,这是它的最原始的SQL,非常符合业务的写法,但是它是个关联子查询。

    关联子查询成本是很贵的,所以上面的文档会教你快速地把它转成一个非关联子查询,大家可以看到中间的子查询和外边的查询之间是没有关联性的。

    第三步,会教大家直接把子查询拿掉,然后转成这样一个SQL,这个就叫业务改造,前后三个SQL的成本都不一样,把关联子查询拆掉的成本,拆掉以后SQL会跑得非常好,但这个SQL已经不能良好表义了,只有在诊断到SQL成本比较高的情况下才建议大家使用这种方式。

    为什么它能够把一个关联子查询拆掉呢?

    这背后的原理是关系代数,所有的SQL都可以被表达成等价的关系代数式,关系代数式之间有等价关系,这个等价关系通过变换可以把关联子查询拆掉。

    上面的这篇文档是一个大学的教材,它从头教了关于代数和SQL之间的关系。然后一步步推导怎么去简化这句SQL。

    第一,MySQL本身提供了很多命令来观察MySQL自身的各类状态,大家从上往下检一般能检到SQL的问题或者服务器的问题。

    第二,从服务器的角度,我们从巡检的脚本角度入手,服务器的资源就这几种,观测手法也就那么几种,我们把服务器的资源全部都观察一圈就可以了。

    第三,如果实在搞不定,需求方一定要按照数据库容易接受的方式去写SQL,这个成本会下降的非常快,这个是常规的MySQL慢的诊断思路。

④ 如何检查mysql从数据库是否正常运行,脚本

一般在从库执行show slave status,看behind值是否为0来判断。
更准确的一些的方法是在主库做一个表,每秒insert一个时间戳,在从库读取,来看时间差是否超过1秒。

⑤ qtp 怎样添加数据库检查点(转)

将来在运行脚本的过程中,QTP又根据查询语句从当前的数据库中获取实际数据,然后将实际数据与预期数据相比较,从而得知检查点是否成功。 2.修改查询结果 检查点语句生成以后,会产生一个DbTable对象,该对象在关键字视图可以看到,在仓库中也存在。可以通过设置该DBtable对象的object properties属性“Source”来修改SQL语句。修改了SQL语句就表示修改了查询结果。修改了SQL语句后,不能相应的修改预期数据表。 3.如何理解检查点的属性(checkpoint properties) 上面的表是创建检查点时截取的。(无论什么时候打开本属性窗口, 表中的数据都不会改变,但可以通过窗口中的“Configure value->Constant”来手工修改表中的数据,通过这种方式修改了数据后,就相当于对截图进行了修改。如果通过“Configure value->Parameter”来将单元格的数据参数化,虽然看起来是数据被修改,但是如果再选择Constant,数据就会恢复,因此通过参数化数据的方法,不会真正影响截图的数据。) 4.指定要检查的区域 在表中指定想要检查的区域。(区域中的显示的值就是预期值。预期值可以是常数,也可以是参数变量。当在Cell Identification页中设置列by position时,本表的列必须与实际查询表的列相对应,否则检查不能通过。如在生成检查点语名时查询语句为“select username,id,realname from sys_user t”,后来通过修改object properties,将查询语句改为“select username,realname,id from sys_user t”,则执行检查时是不能通过的,因为查询表中第2、3列的数据已经不能与截取的表相对应。同理,如果在Cell Identification页中设置行by rownumber时,也会有同样的问题存在。) 以下是属性框三个页签中的内容: (1)Expected Data—设置预期值,可以是常量或参数。如,可以要求QTP从DAta table中取值作为预期值。 (2)Settings—设置预期值与实际值相比较时的语法规则。 (3)Cell Identification—指导QTP放置被检查的数据。如,假设你想检查位于检查点属性框中第一行第2列的数据,但是你明白,每运行一次测试脚本,查询出来的数据的行的排序可能发生改变。因此,让QTP通过列名和行row containing a known value in akey column来定位单元格,而不是通过列数或行数来定位单元格。 5.检查点属性窗: Checkpoint timeout—指定检查点运行的最长时限,QTP在检查点通过(在本时间范围内)或超时后,才进行下一步操作。如果在最长时限时还没有检查通过,则本检查失败。 例如,检查点装载数据需要一定的时间,增长checkpoint timeout时间,可保证检查点有足够的时间通过检查,不会超时失败。 注:Checkpoint timeout选项仅仅对table检查点有效,对于database检查点无效。 Insert statement—在新增检查点时,指明检查点语句在脚本中的插入位置。 注意:Insert statement选项在录制或修改检查点时无效,只在新增检查点时有效。 注意:当一列是key column时,该列不一定是被检查的列,key column的数据仅用来帮助确定被检查的数据行。 6.指定数据的比较规则 默认情况下,认为真实数据单元是字符串型,并进行精确检查,但是忽略空格。 (1)Verification type (2)Exact match 默认。 精确匹配。选中此项,则进行精确匹配;不选中,则只要预期值包含在真实值之中即可。 注意:只有当Verirication type为String Content时,才显示这个选项。 (3)Ignore space 默认。在比较时忽略单元格中的空格。添加或减少空格不会影响检查结果。 注意:只有当Verirication type为String Content时,才显示这个选项。 (4)Match case 区分字母的大小写。 注意:只有当Verirication type为String Content时,才显示这个选项。 (5)Min / Max Cell Identification页签包括以下选项: (1)Identify columns 指定将与预期数据相比较的实际数据单元在实际数据表中的列位置。 By position—根据列的顺序位置来定位(即预期数据表中的第N列对应实际数据表中的第N列)。如果列位置产生位移,就会导致不匹配。本选项一般用于Table检查点。 By column name—根据列名来定位(即预期数据表中的列名对应实际数据表中的列名)。列的位移不对检查点产生影响。一般用于database检查点,对于Table检查点无效。 (2)Identify rows 指定将与预期数据相比较的实际数据单元在实际数据表中的行位置。 By row number—默认。根据行的顺序位置来定位(即预期数据表中的第N行对应实际数据表中的第N行)。如果行发生位移,就会导致不匹配。 By selected key column(s)—选中此项以后,可以设置关键列,关键列列名旁有一个“钥”标记。在定位行时,到实际数据表的关键列中查找与预期数据表关键列的值相匹配的值,所找到的第1个匹配值则是正确的行。行的顺序位移不影响检查结果。如果数据库中有多行同时满足条件,则QTP只检查第1条记录。关键值可以是多个列的联合值。 在对关键列进行匹配时,使用Setting页签的verification type选项中设置的匹配规则。 注:只有当选中了By selected key column(s)选项时,本选项才有效。 当选择by row number时,属性窗中预期值所在的行数,应该与真实数据所在的行数相同,否则匹配失败。因此行移位都会导致检查失败。 当选择by selected key column(s)时,属性窗口中预期值可以在任意行位置。执行检查时,以该行Key column列的值为条件在数据库中进行筛选,如果选出了符合条件的记录,则将该记录与预期值进行比较,如果记录数据全部匹配,则检查通过。(当有多个Key Column列时,则筛选条件为这些列的数据的联合)。 要注意几个问题: (1) 只有被打勾的数据才被检查,其它没打勾的即使不匹配也没关系。 (2) Key column列的数据如果没有打勾,也不会被检查,它只是提供查询条件。 (3) 属性窗口数据表中的数据本身就是默认预期数据,当然用户可以对这些预期数据进行修改。 (4) 在属性窗口数据表中的数据是相对固定的,除非用户在本属性窗口中特殊别进行了修改。 (5) 本属性窗口数据表中的所看到的数据都是预期数据,真实数据表是看不到的。真实数据表在每次执行脚本时都有可能不同。 (6) 在运行结果(result)中,如果检查失败,则可点击“checkpoint ‘表名’”看到检查结果表。双击表中的单元格,弹出窗口显示该单元格的预期值与真实值。当然,本结果表中显示的仍然是预期值。 (7) 如果在属性窗口的数据表中设置了一个检查点数据,但是数据库中有多条满足条件的数据,则只检查第一条满足条件的数据,如果第1条检查完全匹配,则通过,如果不匹配,则失败。 (8) 如果在属性窗口的数据表中设置了多个相同的检查点数据,但数据库中只有一条满足条件的数据,该条数据只与第1个检查点进行匹配检查。其它几个检查点失败。

⑥ 检查mysql数据库是否存在坏表

[代码] [Shell/批处理]代码#!/bin/bash #此脚本的主要用途是检测mysql服务器上所有的db或者单独db中的坏表 #变量说明 pass mysql账户口令 name mysql账号名称 data_path mysql目录路径 directory_list 目录列表 file_list文件列表 db_name 数据库名称 repair_count单库中待修复的表总数 #变量说明 repair_count_all所有库中待修复的表总数 mysql_version mysql版本 _file_name 数据表名称 echo -e "此脚本的主要用途是检测mysql服务器上所有的数据库或者单独数据库中的坏表\n\n" pass=123456 name=root read -p "输入mysql存储路径: " choose data_path=$choose unset choose read -p "请输入mysql命令路径: " mysql_version #标准输入、标准输出、标准错误输出的文件标示符 由 0、1、2标识 read -p "请选择是检查服务器上所有数据库还是指定的数据库 1:检查全部数据库 2:只检查指定数据库: " choose if [ $choose == 1 ]; then cd $data_path for directory_list in $(ls) do if [ -d $directory_list ];then if [ "mysql" != "${directory_list}" -a "test" != "${directory_list}" ];then cd ${directory_list} echo "当前检查数据库为:"${directory_list} for file_list in $(ls *.frm) do _file_name=${file_list%.frm} echo -e "\n" >> /tmp/check_table_all.log ${mysql_version} -h 127.0.0.1 -u${name} -p${pass} -e "check table "${directory_list}.${_file_name} 2>&1 >> /tmp/check_table_all.log done cd .. fi fi done cat /tmp/check_table_all.log | grep "Table is marked as crashed" > /tmp/check_table_repair.log repair_count_all=` awk 'END{print NR}' /tmp/check_table_repair.log ` echo -e "所有数据库用有${repair_count_all}张表需要修复!" more /tmp/check_table_repair.log else read -p "请输入要检查的数据库名称: " db_name cd ${data_path}/${db_name} for file_list in $(ls *.frm) do _file_name=${file_list%.frm} echo -e "\n" >> /tmp/check_${db_name}.log ${mysql_version} -h 127.0.0.1 -u${name} -p${pass} -e "check table "${db_name}.$_file_name 2>&1 >> /tmp/check_${db_name}.log done cat /tmp/check_${db_name}.log | grep "Table is marked as crashed" > /tmp/check_${db_name}_Repair.log repair_count=`awk 'END{print NR}' /tmp/check_${db_name}_Repair.log` echo -e "${db_name}中共有${repair_count}个表需要修复!\n " more /tmp/check_${db_name}_Repair.log fi

⑦ 怎么查看mysql数据库中的表是否损坏

可以使用语句检查表。如果结果的msg_text部分是好的,那么你的表是健康的。反之,则表明mysql数据库中的表有损坏。另外有些厉害的高手一额可以通过运行脚本来检测。

MyISAM表可以采用以下方法进行修复:使用reapair table或myisamchk来修复。如果修复无效,采用备份恢复表。

阶段1:检查你的表

如果你有很多时间,运行myisamchk *.MYI或myisamchk -e *.MYI。使用-s(沉默)选项禁止不必要的信息。如果mysqld服务器处于宕机状态,应使用--update-state选项来告诉myisamchk将表标记为'检查过的'。

你必须只修复那些myisamchk报告有错误的表。对这样的表,继续到阶段2。如果在检查时,你得到奇怪的错误(例如out of memory错误),或如果myisamchk崩溃,到阶段3。

阶段2:简单安全的修复

注释:如果想更快地进行修复,当运行myisamchk时,你应将sort_buffer_size和Key_buffer_size变量的值设置为可用内存的大约25%。

首先,试试myisamchk -r -q tbl_name(-r -q意味着“快速恢复模式”)。这将试图不接触数据文件来修复索引文件。如果数据文件包含它应有的一切内容和指向数据文件内正确地点的删除连接,这应该管用并且表可被修复。开始修复下一张表。否则,执行下列过程:

在继续前对数据文件进行备份。使用myisamchk -r tbl_name(-r意味着“恢复模式”)。这将从数据文件中删除不正确的记录和已被删除的记录并重建索引文件。

如果前面的步骤失败,使用myisamchk --safe-recover tbl_name。安全恢复模式使用一个老的恢复方法,处理常规恢复模式不行的少数情况(但是更慢)。如果在修复时,你得到奇怪的错误(例如out of memory错误),或如果myisamchk崩溃,到阶段3。

阶段3:困难的修复

只有在索引文件的第一个16K块被破坏,或包含不正确的信息,或如果索引文件丢失,你才应该到这个阶段。在这种情况下,需要创建一个新的索引文件。按如下步骤操做:

把数据文件移到安全的地方。使用表描述文件创建新的(空)数据文件和索引文件:

shell> mysql db_name

mysql> SET AUTOCOMMIT=1;

mysql> TRUNCATE TABLE tbl_name;

mysql> quit

如果你的MySQL版本没有TRUNCATE TABLE,则使用DELETE FROM tbl_name。将老的数据文件拷贝到新创建的数据文件之中。回到阶段2。现在myisamchk -r -q应该工作了。你还可以使用REPAIR TABLE tbl_name USE_FRM,将自动执行整个程序。

阶段4:非常困难的修复

只有.frm描述文件也破坏了,你才应该到达这个阶段。这应该从未发生过,因为在表被创建以后,描述文件就不再改变了。

从一个备份恢复描述文件然后回到阶段3。你也可以恢复索引文件然后回到阶段2。对后者,你应该用myisamchk -r启动。

如果你没有进行备份但是确切地知道表是怎样创建的,在另一个数据库中创建表的一个拷贝。删除新的数据文件,然后从其他数据库将描述文件和索引文件移到破坏的数据库中。这样提供了新的描述和索引文件,但是让.MYD数据文件独自留下来了。回到阶段2并且尝试重建索引文件。

⑧ 如何通过shell脚本来检查或监控MYSQL数据库

  • db2 connect to [dbname] db2 "select min(a) from b;" > t.txtdb2 terminatedate=`cat t.txt | tail -2 | head -1` echo $date

⑨ MCGS组态软件脚本编程,实时数据库已经定义了数据对象,检查却通不过!

是你用错了,op.Value是字符串,字符串比较!strComp函数

望采纳。。。。

⑩ 需要检查页面查询的结果和数据库结果是否一致 怎么用python自动化写一个脚本

#!/usr/bin/env python import sys str = True while (str): dig = int(input()) if dig > 100: print 'please input mun between 0~100' elif dig >= 90: print 'A' elif dig >= 80: print 'B' elif dig >= 70: print 'C' elif dig >= 60: prin...