根据 dba_errors 制定 数据库报警邮件

一.  dba_errors 表

 

官网对这个表的说明如下:

 

ALL_ERRORS:describes the current errors on the stored objects accessible to the current user.

DBA_ERRORS:describes the current errors on all stored objects in the database.

 

USER_ERRORS: describes the current errors on the stored objects owned by the current user. This view does not display the OWNER column.

 

示例:

SQL> select owner,name,type,text,attribute from dba_errors;

 

OWNER      NAME                      TYPE         TEXT                                               ATTRIBUTE

---------- ------------------------- ------------ -------------------------------------------------- ---------

SYS        PROC_ALARM_KC_SCB         PROCEDURE    PL/SQL: ORA-00942: table or view does not exist    ERROR

SYS        PROC_ALARM_KC_SCB         PROCEDURE    PL/SQL: SQL Statement ignored                      ERROR

SYS        PROC_ALARM_KC_SCB         PROCEDURE    PLS-00201: identifier 'JOBLOG.WRITELOG' must be de ERROR

SYS        PROC_ALARM_KC_SCB         PROCEDURE    PL/SQL: Statement ignored                          ERROR

SYS        PROC_ALARM_KC_SCB         PROCEDURE    PLS-00201: identifier 'RUNLOG.ERRORLOG' must be de ERROR

SYS        PROC_ALARM_KC_SCB         PROCEDURE    PL/SQL: Statement ignored                          ERROR

 

       从这个表里面,我们可以看到数据库当前存在的错误,这些错误信息包含对象名称,类型,所有者,错误类型和错误原因。

       如果该表里有这些错误,就可以调用Oracle 的发送邮件的存储过程,将这些信息发送到相关邮箱或者移动的139邮箱,该邮箱可以直接将邮件发送到手机。 这样就可以起到一个及时通知的作用。

 

发送邮件的存储过程参考Blog:

      

Oracle 发送邮件 存储过程

http://blog.youkuaiyun.com/xujinyang/article/details/6830560

 

二. 存储过程

 

/* Formatted on 2011/5/19 20:48:30 (QP5 v5.163.1008.3004) */

CREATE OR REPLACE PROCEDURE getsenterrlog

AS

   email_title      VARCHAR2 (100);                                 --email 标题

   email_content    VARCHAR2 (1000);                                --email 内容

   email_server     VARCHAR2 (20);                                -- email 服务器

   email_sender     VARCHAR2 (20);                                --email 发送邮箱

   email_user       VARCHAR2 (20);                                  --email 用户

   email_pwd        VARCHAR2 (20);                                   --emai 密码

   email_receiver1   VARCHAR2 (100);                               --email  接收人

   email_receiver2   VARCHAR2 (100);                               --email  接收人

   email_receiver3   VARCHAR2 (100);                               --email  接收人

   CURSOR c1

   IS

      SELECT * FROM dba_errors;

BEGIN

   /**

   过程内容: 查询dba_errors 表,如果有错误,就发送到139邮箱

   作者: Dave

   时间:2011-5-19

   */

   email_server := '192.168.1.100';

   email_sender := 'dvd.dba@gmail.com';

   email_user := 'tianlesoftware';

   email_pwd := 'pwd';

   email_receiver1 :=

      '13888888888@139.com;dvd.dba@gmail.com';

   email_receiver2 :=

      '13888888888@139.com;dvd.dba@gmail.com';

   email_receiver3 :=

      '13888888888@139.com;dvd.dba@gmail.com';

 

   FOR x IN c1

   LOOP

      IF x.owner = 'SYS'

      THEN

         email_title := x.owner|| ',s '|| x.TYPE|| ': '|| x.name|| ' report ' || x.attribute || '!';

         email_content := x.text;

         --  DBMS_OUTPUT.put_line (email_title);

         --DBMS_OUTPUT.put_line (email_content);

         procsendemail (email_content,email_title, email_sender,email_receiver1, email_server,25,1,email_user,email_pwd, '', 'bit 7');

      ELSIF x.owner = 'SYSTEM'

      THEN

         email_title := x.owner|| ',s '|| x.TYPE|| ': '|| x.name|| ' report ' || x.attribute || '!';

         email_content := x.text;

         --  DBMS_OUTPUT.put_line (email_title);

         --DBMS_OUTPUT.put_line (email_content);

              --调用发送邮件过程

         procsendemail (email_content,email_title, email_sender,email_receiver2, email_server,25,1,email_user,email_pwd, '', 'bit 7');

      ELSE

         email_title := x.owner|| ',s '|| x.TYPE|| ': '|| x.name|| ' report ' || x.attribute || '!';

         email_content := x.text;

         --  DBMS_OUTPUT.put_line (email_title);

         --DBMS_OUTPUT.put_line (email_content);

         procsendemail (email_content,email_title, email_sender,email_receiver3, email_server,25,1,email_user,email_pwd, '', 'bit 7');

      END IF;

   END LOOP;

EXCEPTION

   WHEN NO_DATA_FOUND

   THEN

      RETURN;

   WHEN OTHERS

   THEN

      RETURN;

END;

 

       不同用户的错误,发送到相关的责任人,当然DBA 肯定都要收到。

 

三. 使用Scheduler Job 部署

 

Oracle 10g Scheduler 特性

http://blog.youkuaiyun.com/xujinyang/article/details/6830222

 

3.1 创建Job:

BEGIN

DBMS_SCHEDULER.CREATE_JOB (

job_name => 'Jobgetsenterrlog',

job_type => 'STORED_PROCEDURE',

job_action => 'GETSENTERRLOG',  --调用的过程名称

start_date => sysdate,

repeat_interval => 'FREQ=MINUTELY;INTERVAL=1'); -- 每个一分钟执行一次

END;

/

 

       关于这些参数的说明,参考上面的链接。

 

注意:

       JOB 虽然成功创建了,但却并未执行.因为ENABLED 参数当不显式指定时,该参数的默认值为false。

 

3.2 启用Job

exec dbms_scheduler.enable('Jobgetsenterrlog');

 

3.3 停止Job

exec dbms_scheduler.disable(' Jobgetsenterrlog');



-------------------------------------------------------------------------------------------------------

<think>我们正在处理用户的问题:“PHP display_errorsdisabled howto enable”根据用户意图,他们想要启用PHP中已被禁用的display_errors配置项。步骤:1.理解display_errors:这是一个PHP配置指令,用于控制是否将错误信息作为输出的一部分显示在屏幕上。2.通常,在生产环境中建议关闭(display_errors=Off),在开发环境中建议打开(display_errors=On)以便于调试。3.启用display_errors的方法有多种,取决于用户对服务器的访问权限和配置方式。根据引用资料,我们可以参考以下方法:-引用[3]提到可以通过.htaccess文件来配置,在文件中加入一行(例如:php_flagdisplay_errors on)。-引用[4]提到在Apache的配置文件(如apache2.conf)中设置ServerName来避免警告,但同样,我们可以在Apache配置文件中设置PHP的配置项(如php_valuedisplay_errors on)。 -另外,还可以通过修改php.ini文件或使用ini_set()函数在运行时设置。具体方法:方法1:修改php.ini文件(需要服务器访问权限)-找到php.ini文件(位置可能因系统而异,常见路径:/etc/php/版本号/apache2/php.ini或 /etc/php.ini)-搜索display_errors,将其设置为On-重启Apache或PHP-FPM服务方法2:使用.htaccess文件(适用于Apache服务器,且AllowOverride选项允许)-在网站根目录(或需要启用错误显示的目录)的.htaccess文件中添加:php_flagdisplay_errors on-保存后,通常不需要重启服务,因为.htaccess会即时生效(如果配置允许)。方法3:在Apache配置文件中设置(虚拟主机配置或全局配置)-在<VirtualHost>段或全局配置中,使用php_value或php_flag指令:php_valuedisplay_errors on-重启Apache服务。方法4:在PHP脚本中使用ini_set()函数(需要脚本有执行权限,且display_errors未被ini_set禁用)-在PHP脚本开头添加:ini_set('display_errors','1');ini_set('display_startup_errors','1'); //如果需要显示启动错误error_reporting(E_ALL); //报告所有错误-注意:如果display_errors在php.ini中被禁用(mastervalue),并且没有设置允许ini_set覆盖,那么这种方法可能不会生效。方法5:通过用户自定义错误处理(引用[1]提到)来显示错误,但这不是直接启用display_errors,而是自定义错误显示方式。注意:在修改配置后,检查是否生效:-可以创建一个测试脚本(如:<?phpecho1/0;?>),然后查看是否显示除以零的警告。安全提示:在开发环境启用错误显示是安全的,但在生产环境请务必关闭,以免泄露敏感信息。根据用户的问题,我们提供清晰的步骤。生成相关问题:1.如何检查当前PHP的display_errors设置?2.修改php.ini后需要重启什么服务?3.为什么ini_set()无法启用display_errors?4.如何设置错误报告级别(error_reporting)?5.除了display_errors,还有哪些方法可以记录PHP错误?6.如何在生产环境中安全地调试PHP错误?</think>### 启用 PHP 的 display_errors 配置项 当 PHP 的 `display_errors` 被禁用时,可通过以下方法启用(按推荐顺序排列): #### 方法 1:修改 `php.ini` 文件(永久生效) 1. **定位配置文件** - 通过 `phpinfo()` 查找 "Loaded Configuration File" 路径 - 常见路径:`/etc/php/版本号/apache2/php.ini` 或 `/etc/php.ini` 2. **修改配置** ```ini display_errors = On ; 启用错误显示 error_reporting = E_ALL ; 报告所有错误类型 ``` 3. **重启 Web 服务** ```bash sudo systemctl restart apache2 # Apache sudo systemctl restart php-fpm # PHP-FPM ``` #### 方法 2:使用 `.htaccess` 文件(仅 Apache) 1. 在网站根目录创建/修改 `.htaccess` 文件 2. 添加指令: ```apache php_flag display_errors on php_value error_reporting 32767 # E_ALL 值 ``` 3. 无需重启服务,即时生效(需确保 Apache 配置允许覆盖)[^3] #### 方法 3:运行时通过 `ini_set()`(临时生效) 在 PHP 脚本开头添加: ```php <?php ini_set('display_errors', '1'); ini_set('display_startup_errors', '1'); // 显示启动错误 error_reporting(E_ALL); // 报告所有错误 ?> ``` > ⚠️ 注意:若主配置禁用 `display_errors` 且未设置 `allow_url_fopen=On`,此方法可能无效[^1] #### 方法 4:修改 Apache 主配置 在虚拟主机配置或 `apache2.conf` 中添加: ```apache <Directory "/var/www/html"> php_admin_value display_errors on php_admin_value error_reporting 32767 </Directory> ``` 重启 Apache 生效:`sudo systemctl restart apache2`[^4] --- ### 验证配置是否生效 1. 创建测试脚本 `test.php`: ```php <?php echo 1/0; ?> ``` 2. 访问该脚本,若显示 **Warning: Division by zero** 则成功 > 🔒 安全提示:生产环境务必禁用 `display_errors`,改用 `log_errors=On` 记录到文件[^1] --- ### 常见问题排查 | 问题现象 | 解决方案 | |---------|----------| | 修改后仍不显示错误 | 检查 `error_reporting` 级别是否包含目标错误类型 | | `.htaccess` 无效 | 确认 Apache 配置 `AllowOverride All` | | 仅显示空白页 | 检查 `display_startup_errors` 是否开启 | | 出现 "Headers already sent" 错误 | 确保 `ini_set()` 在脚本最顶部调用 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值