精华内容
下载资源
问答
  • mysql存储过程执行日志
    千次阅读
    2020-10-06 20:06:25

    1.简介

    mysql存储过程中无法通过控制台输出什么日志,只能将日志插入数据表来进行记录

    如果存储过程本身要返回查询数据,则日志只能在存储过程执行完毕后,单独查看

    如果存储过程不反悔查询数据,则可以在存储过程最后进行日志的查询

     

    2.表结构

     

    CREATE TABLE `log` (
      `log_name` varchar(20) NOT NULL,
      `content` varchar(100) DEFAULT NULL,
      `start_time` timestamp(3) NULL DEFAULT NULL,
      KEY `log_name` (`log_name`) /*!80000 INVISIBLE */,
      KEY `start_time` (`start_time`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
    
    
    • log_name:日志记录器名称,可以为存储过程的名称
    • content:日志内容
    • start_time:存储过程开始执行的时间
    • log_name、start_time分别包含索引

     

    3.存储过程

     

    CREATE DEFINER=`root`@`localhost` PROCEDURE `log_table_test`()
    BEGIN
    	#日志名称
    	declare log_name varchar(40) default
    更多相关内容
  • 以上字段按顺序分别是ID,存储过程名称,错误代码,错误描述,插入时间,间隔时间。 第二步、在存储过程中添加以上字段的变量 -- 日志记录参数 DECLARE v_id VARCHAR(50);-- 日志表ID DECLARE v_name VARCHAR(50...

    本博客根据官方提供的信息,及查阅多个博客综合,且自己在环境中试验并验证方案可行。

    接下来进入正题,我会尽力写的更通俗易懂一些。

    第一步、建一张日志表,具体字段可以根据需求来设计,下图是我的参考

     以上字段按顺序分别是ID,存储过程名称,错误代码,错误描述,插入时间,间隔时间。

    第二步、在存储过程中添加以上字段的变量

    -- 日志记录参数
        DECLARE v_id VARCHAR(50);-- 日志表ID
        DECLARE v_name VARCHAR(50) DEFAULT 'PROC_IMPORTNEWCONTRACT_REAL'; -- 过程名称
        DECLARE v_code VARCHAR(10) DEFAULT '00000';-- 错误码
        DECLARE v_msg_text TEXT DEFAULT 'SUCCESS';-- 返回消息默认为SUCCESS
        DECLARE v_date DATETIME DEFAULT NOW();-- 插入时间默认当前时间
        DECLARE v_invatime DATETIME DEFAULT NOW();-- 间隔时间默认当前时间

    以上代码是放在BEGIN下面的

    最后一步、事务提交与日志记录

     

    以上代码是放在BEGIN   END的END前面的,其中间的逻辑代码无需改变,如果你有特殊需求可以再改造。

    参考资料:

    上述的CONTINUE意思为sql发生异常时,为保证存储过程继续往下执行,执行ROLLBACK,进而执行日志记录的操作。如果将CONTINUE改为EXIT,则意为产生异常时,该存储过程会退出,无法执行日志记录的操作,因为该存储过程直接退出了。

    RETURNED_SQLSTATE,返回报错代码,MESSAGE_TEXT返回报错具体信息,官方提供的信息里面是上面的写法。 

    参考博客:Mysql异常捕获并记录_未名-CSDN博客

     

    展开全文
  • 什么是存储过程 简单的说,就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法; ps:存储过程跟触发器有点类似,都是一组...MySQL存储过程的创建 语法 CREATE PROCEDURE sp_name (
  • 一个mysql存储过程,可以动态执行sql

    千次阅读 2022-01-30 19:25:21
    mysql 可以动态执行sql的存储过程存储过程里使用游标
    drop procedure if exists proc_importing_data;
    
    delimiter //
    
    create procedure proc_importing_data(IN t VARCHAR(80))
    
    begin
    
    	DECLARE v_limits INTEGER DEFAULT 100;
    
    	DECLARE v_table_name VARCHAR(200);
    
    	DECLARE v_last_id INTEGER DEFAULT 0;
    
    	DECLARE v_id INTEGER DEFAULT 0;
    
    	DECLARE v_procedure_name  VARCHAR(200);
    
    	DECLARE lastid integer DEFAULT 0;
    
    	DECLARE no_more_record integer DEFAULT 0;
    
    	declare v_sql varchar(500);
    
    	DECLARE cur_record CURSOR FOR SELECT id,limits,to_table_name,last_id,procedure_func FROM export_data_fun where procedure_func =t  and lock_status=0 limit 1;
    
    	DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_record = 1;
    
    	OPEN cur_record;
    
    	IF no_more_record = 0 THEN
    
    		  -- 提取游标里的数据
    
    		FETCH cur_record INTO v_id,v_limits,v_table_name,v_last_id,v_procedure_name;
    
    			if v_procedure_name=t THEN
    
    			  -- select v_id,v_limits,v_table_name,v_last_id;
    
    			  -- 记录日志
    
    			  UPDATE export_data_fun set lock_status=1 where id=v_id;
    
    			  INSERT into export_run_log(table_name,start_id,create_time,export_data_fun_id)VALUES(v_table_name,v_last_id,now(),v_id);
    
    			  set lastid=LAST_INSERT_ID();   
    
    			  set @vv_last_id=v_last_id;
    
    			  set @vv_limits=v_limits;
    
    			  set @v_sql=concat(" call ",v_procedure_name,"(?,?);");
    			  
    
    			  PREPARE stmt FROM @v_sql;
    
    			  EXECUTE stmt USING @vv_limits,@vv_last_id;    -- 执行SQL语句
    
    			  deallocate prepare stmt;     -- 释放掉预处理段
    
    			  -- 更新同步点  
    
    			  UPDATE export_data_fun set lock_status=0,last_id=@vv_last_id where id=v_id;
    
    			  -- 记录执行时间
    
    			  UPDATE export_run_log set last_id=@vv_last_id,end_time=NOW()  where id=lastid;      
    
    			END IF;
    
    	ELSE
    
    		select "no data or table lock";
    	END IF; 
    
    end //
    
    delimiter ;

    这个存储过程实际上是通过调用其他存储过程来工作的,迁移数据的时候使用,

    具体迁移数据的步骤如下:

    1. 插入迁移表中要迁移表的数据, 起始点,每次同步的数据量、 迁移存储过程名
    2. 编写迁移数据的存储过程
    3. 添加 crontab 定期执行   (控制多长时间执行一次迁移,迁移表中limits定义每次迁移多少条数据 )
    展开全文
  • MYSQL定时执行存储过程

    千次阅读 2021-03-04 00:08:37
    实战mysql存储程序与定时器 存储过程定时器eventprocedure实战 需求:一个庞大的日志表,现每天做定时统计一天的总数,放另一个表中,方便查看,运营。 旧方案:用脚本写好程序,用linux的crontab定时执行。 本文...

    查看event是否开启: show variables like '%sche%';

    将事件计划开启: set global event_scheduler=1;

    关闭事件任务: alter event e_test ON COMPLETION PRESERVE DISABLE;

    开户事件任务: alter event e_test ON COMPLETION PRESERVE ENABLE;

    简单实例.

    创建表 CREATE TABLE test(endtime DATETIME);

    创建存储过程test

    CREATE PROCEDURE test ()

    BEGIN

    update examinfo SET endtime = now() WHERE id = 14;

    END;

    创建event e_test

    CREATE EVENT if not exists e_test

    on schedule every 30 second

    on completion preserve

    do call test();

    每隔30秒将执行存储过程test,将当前时间更新到examinfo表中id=14的记录的endtime字段中去.

    实战mysql存储程序与定时器

    存储过程定时器eventprocedure实战

    需求:一个庞大的日志表,现每天做定时统计一天的总数,放另一个表中,方便查看,运营。

    旧方案:用脚本写好程序,用linux的crontab定时执行。

    本文重点,用mysql定时器定时执行存储程序。

    第一步:编写存储程序(需了解基本的存储程序的语法)

    Sql代码

    create procedure inproc()

    begin

    declare done int default 0;

    declare a,b,c int;

    declare curl cursor for select ver,date_format(time,'%Y%m%d') as dt,count(*) as count from ty.count where time>date_sub(curdate(),interval 1 day) group by ver,dt;

    declare continue handler for sqlstate '02000' set done = 1;

    open curl;

    repeat

    fetch curl into a,b,c;

    if not done then

    insert into ty.daycount values (null,b,a,c);

    end if;

    until done end repeat;

    close curl;

    end

    这个存储程序主要用过了declare定义局部变量,声明curl光标,利用光标直到遍历结果集的作用。

    执行这个语句之前要先

    Sql代码

    delimiter $$

    执行完成后再

    Sql代码

    delimiter ;

    用show查看是否已经成功

    Sql代码

    show procedure status like '%%';

    第二步:开启mysql定时器

    如果不是on,就执行

    Sql代码

    set global event_scheduler=1;

    不需要重启mysql

    会发现mysql多起了一个daemon进程

    (注: 对于我们线上环境来说,使用event时,注意在主库上开启定时器,从库上关闭定时器,event触发所有操作均会记录binlog进行主从同步,从库上开启定时器很可能造成卡库。切换主库后之后记得将新主库上的定时器打开。)

    第三步:创建定时任务

    语法:

    CREATE EVENT 的语法如下:

    CREATE EVENT

    [IF NOT EXISTS] ---------------------------------------------*标注1

    event_name -----------------------------------------------------*标注2

    ON SCHEDULE schedule ------------------------------------*标注3

    [ON COMPLETION [NOT] PRESERVE] -----------------*标注4

    [ENABLE | DISABLE] ----------------------------------------*标注5

    [COMMENT 'comment'] --------------------------------------*标注6

    DO sql_statement -----------------------------------------------*标注7

    ;

    标注3:ON SCHEDULE

    ON SCHEDULE 计划任务,有两种设定计划任务的方式:

    1. AT 时间戳,用来完成单次的计划任务。

    2. EVERY 时间(单位)的数量时间单位[STARTS 时间戳] [ENDS时间戳],用来完成重复的计划任务。

    在两种计划任务中,时间戳可以是任意的TIMESTAMP 和DATETIME 数据类型,时间戳需要大于当前时间。

    在重复的计划任务中,时间(单位)的数量可以是任意非空(Not Null)的整数式,时间单位是关键词:YEAR,MONTH,DAY,HOUR,MINUTE 或者SECOND。

    提示: 其他的时间单位也是合法的如:QUARTER, WEEK, YEAR_MONTH,DAY_HOUR,DAY_MINUTE,DAY_SECOND,HOUR_MINUTE,HOUR_SECOND, MINUTE_SECOND,不建议使用这些不标准的时间单位。

    标注4: [ON COMPLETION [NOT] PRESERVE]

    ON COMPLETION参数表示"当这个事件不会再发生的时候",即当单次计划任务执行完毕后或当重复性的计划任务执行到了ENDS阶段。而PRESERVE的作用是使事件在执行完毕后不会被Drop掉,建议使用该参数,以便于查看EVENT具体信息。

    标注5:[ENABLE | DISABLE]

    参数Enable和Disable表示设定事件的状态。Enable表示系统将执行这个事件。Disable表示系统不执行该事件。

    可以用如下命令关闭或开启事件:

    Sql代码

    ALTER EVENT event_name ENABLE/DISABLE

    下面是我的实例,每天凌晨一点执行

    Sql代码

    CREATE EVENT `event_call_inproc` ON SCHEDULE EVERY 1 DAY STARTS '2013-09-12 01:00:00' ON COMPLETION PRESERVE ENABLE DO begin call ty.inproc();end

    另外的一些例子:

    Sql代码

    每个月的一号凌晨1 点执行

    CREATE EVENT EVENT2

    ON SCHEDULE EVERY 1 MONTH STARTS DATE_ADD(DATE_ADD(DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY), INTERVAL 1 MONTH),INTERVAL 1 HOUR)

    ON COMPLETION PRESERVE ENABLE

    DO

    BEGIN

    CALL STAT();

    END

    每个季度一号的凌晨2点执行

    CREATE EVENT TOTAL_SEASON_EVENT

    ON SCHEDULE EVERY 1 QUARTER STARTS DATE_ADD(DATE_ADD(DATE( CONCAT(YEAR(CURDATE()),'-',ELT(QUARTER(CURDATE()),1,4,7,10),'-',1)),INTERVAL 1 QUARTER),INTERVAL 2

    HOUR)

    ON COMPLETION PRESERVE ENABLE

    DO

    BEGIN

    CALL SEASON_STAT();

    END

    每年1月1号凌晨四点执行

    CREATE EVENT TOTAL_YEAR_EVENT

    ON SCHEDULE EVERY 1 YEAR STARTS DATE_ADD(DATE(CONCAT(YEAR(CURDATE()) + 1,'-',1,'-',1)),INTERVAL 4 HOUR)

    ON COMPLETION PRESERVE ENABLE

    DO

    BEGIN

    CALL YEAR_STAT();

    END

    展开全文
  • MySQL存储过程动态SQL语句的生成 用Mysql存储过程来完成动态SQL语句,使用存储过程有很好的执行效率: 现在有要求如下:根据输入的年份.国家.节假日类型查询一个节假日,我们可以使用一般的SQL语句嵌入到Java代码中,...
  • 我有一个MySQL存储过程与一些游标.我想打印一个值以将输出发送回客户端.SQLyog Enterprise.我尝试将一个变量声明为TEXT,并在循环内连接,但这不起作用,至少不是我试图这样做的方式.DECLARE _output TEXT;DECLARE _ID ...
  • 查看MySQL命令执行日志

    千次阅读 2022-03-29 14:09:44
    1.开启日志记录 mysql> set global general_log=on; 2.查看日志文件状态和路径 mysql> show variables like "%general_log%"; +------------------+---------------------------------+ | Variable_name | ...
  • 存储过程是在数据库的服务器端执行的!!! 2)移植性很差!不同数据库的存储过程是不能移植。 3 存储过程语法 -- 创建存储过程 DELIMITER $ -- 声明存储过程的结束符 CREATE PROCEDURE pro_test() --存储过程
  • mysql存储过程中输出日志信息

    万次阅读 2018-04-02 17:17:05
    mysql存储过程中输出日志信息 更多原创性能测试文章关注 十年性能测试专家&7DGroup公众号 直接用select 打印输出 SELECT 'Comment'; 用concat连接变量输出 declare myvar INT default 0; SET myvar...
  • mysql存储过程执行方式

    千次阅读 2021-02-05 08:12:45
    一、mysql存储过程,通过事件定时调用,要求mysql版本5.1以上/*==============================================================*//* 定义存储过程,操作过期行为日志,要求mysql版本5.1及以上 *//*===============...
  • MySQL存储过程

    万次阅读 多人点赞 2022-01-26 16:43:19
    MySQL5.0版本开始支持存储过程,存储过程就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法,存储过就是数据库SQL与层层面的代码封装与重用 特性 1.有输入输出参数,可以声明变量,...
  • 参考:https://stackoverflow.com/questions/26338033/mysql-stored-procedure-print-error-message-and-rollback DELIMITER ;; CREATE PROCEDURE `testProc`() BEGIN #------捕获异常,并打印异常msg-----START...
  • END 运行 输入参数 执行结果 总结: 传入参数用 in 变量名 变量类型 使用传入参数直接用参数名 打印日志直接用select 四、Mysql存储过程中自定义参数 CREATE DEFINER=`root`@`%` PROCEDURE `test_procedure`() ...
  • Server层:主要包括连接器、查询缓存、分析器、优化器、执行器等,所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图,函数等,还有一个通用的日志模块 binglog日志模块。 存储引擎: 主要负责数据的...
  • MySQL保存日志

    千次阅读 2022-04-25 15:51:01
    mysql保存日志
  • mysql存储过程以及日志和数据恢复

    千次阅读 2018-11-14 18:32:03
    MySQL存储过程 Mysql储存过程是一组为了完成特定功能的SQL语句集,经过编译之后存储在数据库中, 当需要使用该组SQL语句时用户只需要通过指定储存过程的名字并给定参数就可以调用执行它了 简而言之就是一组已经写...
  • mysql日志文件

    千次阅读 2022-03-23 22:03:36
    只有一些mysql日志文件原理介绍,相对好一些。mysql因为应用广泛,使用者众,作为数据库的学习对象,也算有代表性。 一、MySQL日志文件 MySQL中有七种日志文件,分别是: 重做日志(redo log) 回滚日志(undo ...
  • MySQL 存储过程模板

    千次阅读 2018-09-25 21:24:20
    mysql 存储过程模板: CREATE PROCEDURE example.proc_Example() SQL SECURITY INVOKER BEGIN #Author: zyz #Create: 2018-09-11 #存储过程示例 #日志记录定义模块 DECLARE sys_StartTime datetime;...
  • navicate创建mysql存储过程,同时需要对存储过程中的查询list结果集进行遍历,获取相应的结果参数执行其他的业务逻辑; 存储过程可定义事件定时器,定时执行函数,具体操作可见另一篇博文:navicate创建mysql存储...
  • 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储...
  • mysql存储引擎

    万次阅读 多人点赞 2019-07-31 19:28:44
    数据库存储引擎 数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还...
  • 如何查看mysql运行、访问记录等日志

    千次阅读 2021-01-25 13:13:52
    如何查看mysql运行、访问记录等日志1.首先确认你日志是否启用了mysql>show variables like 'log_bin';mysql>show variables like 'log';2.如果启用了,即ON如果没有启用,即OFF,要修改my.cnf# The MySQL ...
  • mysql如何让一个存储过程定时执行

    万次阅读 2016-11-23 09:59:09
    mysql怎么让一个存储过程定时执行 查看event是否开启: show variables like '%sche%';  将事件计划开启: set global event_scheduler=1;  关闭事件任务: alter event e_test ON COMPLETION PRESERVE DISABLE; ...
  • MySql存储过程动态创建表并插入数据

    万次阅读 热门讨论 2015-07-31 20:45:54
    MySql存储过程动态创建表并插入数据  最近做的一个项目,数据库用的是MySql,对于MySql不是很熟练,只是会简单的应用,毕竟简单的sql语句还是相通的,但是随着项目的深入复杂的sql语句开始慢慢多起来,其中一个小...
  • MySQL数据库:SQL语句的执行过程

    万次阅读 多人点赞 2021-02-22 03:59:20
    我们的系统在和 MySQL 数据库进行通信前,需要先和数据库建立连接,而这个功能就是由MySQL驱动底层帮我们完成的,建立完连接之后,我们只需要发送 SQL 语句就可以执行 CRUD 了。如下图所示: 一次 SQL 请求就会...
  • 一条sql语句在mysql中的执行过程

    千次阅读 2022-03-11 10:03:26
    本文详细的介绍了一条sql语句在mysql执行的全过程,其中详细的介绍了Server层的各个组件的作用以及承担的角色等。
  • MySQL8.0 日志

    千次阅读 2022-02-20 10:41:55
    MySQL有不同类型的日志文件(各自存储了不同类型的日志),从日志当中可以查询到MySQL数据库的运行情况、用户操作、错误信息等,可以为MySQL管理和优化提供必要的信息。对于MySQL的管理工作而言,这些日志文件是不可...
  • -- 记录错误日志 DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN SET @err = fn_get_error(); INSERT INTO act_records(act,actTime,actDesc,flag) SELECT 'PD_VERIFICATION_TINDEXMIK30',NOW(),@...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 207,651
精华内容 83,060
关键字:

mysql存储过程执行日志

mysql 订阅