MySQL 在讀取異常錯誤緩衝區方面的提公升

2021-09-30 21:48:00 字數 2241 閱讀 6297

先來解釋下什麼是錯誤緩衝區?

mysql裡面,錯誤緩衝區只記錄最近一次出現的錯誤,只要是有新的錯誤產生,舊的就會被覆蓋掉。所以想知道產生了什麼錯誤,就得在每個有可能發生錯誤的語句後面緊跟著"show warnings" 或者 "show errors"。 最簡單的方法是把輸出的結果重定向到自己定義的日誌檔案裡面,這樣就可以方便後續檢視。當然如果想隨時檢視這些錯誤,我們就得通過mysql提供的api來實現。

自從mysql 5.6 這個革命性的版本出現後,問題得到了初步解決。雖然離我們想的還差好多。

mysql 5.6 提供了 get diagnostic 語句來獲取錯誤緩衝區的內容,然後把這些內容輸出到不同範圍域的變數裡,以便我們後續靈活操作。

下來,我們就來看乙個例子。

針對的表結構為:

create table `t_datetime` (

`id` int(11) not null,

`log_time` timestamp not null default current_timestamp on update current_timestamp,

`end_time` datetime not null,

primary key (`id`)

) engine=innodb default charset=utf8

儲存過程**為:

delimiter $$

use `new_t`$$

drop procedure if exists `sp_do_update`$$

createdefiner=`root`@`localhost` procedure `sp_do_update`(

in f_id int,

in f_log_time varchar(255),

in f_end_time varchar(255)

)begin

declare i_con1 tinyint default 0;

declare i_code char(5) default '00000';

declare i_msg text;

declare i_rows int;

declare i_con1 condition for 1048; -- 這個錯誤**代表字段限制不能null。

declare continue handler for i_con1

begin

set i_con1 = 1;

get diagnostics condition 1

i_code = returned_sqlstate, i_msg = message_text;

end;

update t_datetime

set log_time = ifnull(f_log_time,null),

end_time = ifnull(f_end_time,null)

where id = f_id;

if i_con1 = 0 then

get diagnostics i_rows = row_count;

set @i_result = concat("update succeeded, affected ", i_rows,'.');

else

set @i_result = concat('update failed, error code is 1042, related message is ',i_msg,'.');

end if;

select @i_result;

end$$

delimiter ;

我們來執行上面的儲存過程,完了後,就能把錯誤資訊儲存到session 變數@i_result 中。這樣,方便了後期進行各種輸出。

call sp_do_update(1,now(),date_add(now(),interval 1 day));

result.

update succeeded, affected 1.

call sp_do_update(1,null,null);

result.

update failed, error code is 1042, related message is column 'log_time' cannot be null.

***********************************=分割線******************************==

mysql 緩衝區 mysql 執行緒級別的緩衝區

執行緒棧資訊使用記憶體 thread stack 主要用來存放每乙個執行緒自身的標識資訊,如執行緒id,執行緒執行時基本資訊等等,我們可以通過 thread stack 引數來設定為每乙個執行緒棧分配多大的記憶體。排序使用記憶體 sort buffer size mysql 用此記憶體區域進行排序操...

scanf,getchar讀取字元和緩衝區

首先我們來看這樣一段 include intmain printf 請輸入密碼 scanf s password printf 請確認密碼 y n int ch getchar if ch y else 是不是有些同學會認為輸完密碼後,再輸入y就會列印出確認成功呢,但實際上卻並是這樣 可以看到程式並...

mysql 快取區 MYSQL緩衝區和快取設定

mysql緩衝區和快取設定 mysql 支援超過 100 個的可調節設定 但是幸運的是,掌握少數幾個就可以滿足大部分需要。查詢這些設定的正確值可以通過 show status 命令檢視狀態變數,從中可以確定 mysqld 的運作情況是否符合我們的預期。給緩衝區和快取分配的記憶體不能超過系統中的現有記...