日誌記錄資料庫
有時候我們會不小心對一個大表進行了 update,比如說寫錯了 where 條件......
此時,如果 kill 掉 update 線程,那回滾 undo log 需要不少時間。如果放置不管,也不知道 update 會持續多久。
那我們能知道 update 的進度么?
實驗
我們先創建一個測試資料庫:
那我們怎麼准確的這個倍數呢?
一種方法是靠經驗:update 語句的 where 中會掃描多少行,是否修改主鍵,是否修改唯一鍵,以這些條件來估算系數。
另一種方法就是在同樣結構的較小的表上試驗一下,獲取倍數。
這樣,我們就能准確估算一個大型 update 的進度了。
B. 如何配置log4j2日誌記錄至資料庫
配置log4j2日誌記錄至資料庫
1、建立用於保存日誌的資料庫表:
CREATETABLE`sys_log`(
`id`int(11)NOTNULLAUTO_INCREMENT,
`level`varchar(32)NOTNULL,
`logger`varchar(100)NOTNULL,
`message`varchar(1000)DEFAULTNULL,
`exception`varchar(10000)DEFAULTNULL,
`date_add`datetimeNOTNULL,
PRIMARYKEY(`id`)
)ENGINE=InnoDBAUTO_INCREMENT=19DEFAULTCHARSET=utf8mb4;
2、配置 databaseAppender :
<JDBCname="databaseAppender"tableName="sys_log">
<ConnectionFactoryclass="cc.s2m.web.s2mBlog.util.StaticProp"method="getDatabaseConnection"/>
<Columnname="date_add"isEventTimestamp="true"/>
<Columnname="level"pattern="%level"/>
<Columnname="logger"pattern="%logger"/>
<Columnname="message"pattern="%message"/>
<Columnname="exception"pattern="%ex{full}"/>
</JDBC>
3、其中 cc.s2m.web.s2mBlog.util.StaticProp類的getDatabaseConnection方法為獲取可用的datasource:
DriverManagerDataSourceds=newDriverManagerDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://127.0.0.1/s2mBlog?characterEncoding=utf8");
ds.setUsername("root");
ds.setPassword("123456");
returnds.getConnection();
4、指派需要記錄的日誌,使用 databaseAppender即可:
<loggername="SYSLOG"level="INFO"additivity="false">
<appender-refref="databaseAppender"/>
</logger>
C. 如何查看mysql資料庫操作記錄日誌
這是一個慢查詢日誌的展示工具,能夠幫助 DBA 或者開發人員分析資料庫的性能問題,給出全面的數據擺脫直接查看 slow-log。QAN(Query Analytics)
PMM 目前有 2 個版本,但是對於 QAN 來說其大致由三部分組成:
QAN-Agent(client):負責採集 slow-log 的數據並上報到服務端
QAN-API(server):負責存儲採集的數據,並對外提供查詢介面
QAN-APP:專門用來展示慢查詢數據的 grafana 第三方插件
1. 數據流轉
slow-log --> QAN-Agent --> QAN-API <--> QAN-APP(grafana)
2. pmm1 架構圖
D. 資料庫系統的日誌文件用於記錄下述哪類內容
數據更新操作。
日誌文件是用來記錄事務對資料庫更新操作的文件,主要有兩種格式:以記錄為單位的日誌文件和以數據塊為單位的日誌文件。
各個事務的開始StartTransaction標記各個事務的結束Commit或Rollback標記各個事務的所有更新操作。
對以數據塊為單位的日誌文件,日誌記錄的內容包括事務標識和被更新的數據塊。由於將更新前的整個塊和更新後的整個塊都放入日誌文件中,因而操作的類型和操作對象等信息就不必放入日誌記錄中。
E. 的日誌記錄怎麼實現,還要插入資料庫中
1.設計一張日誌表 欄位包含 lid(編號)luser(操作者)ldate(操作時間)lcontext(操作描述)2.編寫一個類Log,裡面有添加日誌的靜態方法(就是寫插入一條記錄到日誌表),以後想添加一條日誌的時候就直接調用該方法3.使用,例如現在剛剛添加了一新人員的信息,那麼可以調用Log類的靜態方法插入一條日誌。4.查看日誌,可以把查看日誌的方法寫在Log類裡面,或者單獨寫都行。 日誌的查詢就是對日誌表的查詢,可以實現多種查詢方式,例如按時間,按操作者,按內容模糊查找等。 這種方法以前做過幾次了,看是不是你想要的。
F. 如何配置log4j2日誌記錄至資料庫
一、前提條件 系統必須是使用LOG4J進行日誌管理,否則方法無效。 系統必須包含中國mons-logging-xxx.jar,log4j-xxx.jar這兩個JAR包,XXX為版本號。 二、操作步驟 1、創建日誌表 要把日誌持久化,必須在資料庫中創建一張用來存儲日誌信息的表,表內欄位為日誌 的一個主要屬性包括:操作類,執行方法,列印時間,日誌級別,日誌內容。 CREATE TABLE RESLOG (LOGID VARCHAR2(20) NOT NULL, CLASS VARCHAR2(200), METHOD VARCHAR2(100), CREATETIME DATE, LOGLEVEL VARCHAR2(50), MSG VARCHAR2(4000)) 因為存儲的類為類的全部路徑,所以CLASS欄位長度需要比較大。 2、日誌管理配置 LOG4J主要有兩種配置文件.properties和.xml,這里以properties文件為基礎來講 述,關於XML文件的配置,相信大家看完下面的介紹也一樣能輕松完成。 通常在LOG4J.PROPERTIES文件的第一行是: log4j.rootLogger= XXX,這句是控制日誌的輸出,如果想吧日誌輸出到資料庫, 則需要在XXX中添加「DB」,如log4j.rootLogger=INFO,stdout,Platform,db。上面 這句就是把日誌中級別為INFO的信息輸出到STDOUT,PLATFORM和DB (DATABASE)中。 配置好如上的信息,LOG4J就知道用戶是想把信息存入資料庫,接下來我們就要來 配置資料庫的相關信息(包括緩存,資料庫連接信息,和執行SQL),配置信息如下: ###JDBCAppender log4j.appender.db = org.apache.log4j.jdbc.JDBCAppender //這個配置是選擇使用JDBCAppender方法,將日誌信息存儲到資料庫。當然,如果你還要做其他操作,可以自己寫個類,繼承JDBCAppender就OK了。 log4j.appender.db.BufferSize=1 //這個配置是告訴LOG4J,有中國條日誌信息後才存入資料庫,我這里是1,就是說有一條就查一條,顯然這樣在生產環境下是很影響系統性能的。 log4j.appender.db.driver=oracle.jdbc.driver.OracleDriver //這個配置是告訴LOG4J,做資料庫存儲所用的驅動。 log4j.appender.db.URL=jdbc:oracle:thin:@:: //這個配置資料庫連接的URL,不用說也都知道。 log4j.appender.db.user=XXX log4j.appender.db.password=XXX //上面兩個是資料庫連接時的用戶名和密碼 log4j.appender.db.sql=insert into RESLOG (LogId,Class,Method,createTime,LogLevel,MSG) values (SQ_RESLOG_LOGID.Nextval,'%C','%M', to_date('%d{yyyy-MM-dd HH:mm:ss}','yyyy-MM-dd HH24:mi:ss'),'%p','%m') //這個配置是告訴當LOG4J吧日誌存儲資料庫時用的SQL語句。SQ_RESLOG_LOGID.Nextval是我建的一個SEQUENCE;『%C』是日誌中的CLASS;『%M』是列印日誌是執行到類里的方法;『%d』是列印的時間,它支持格式化;『%P』是日誌級別,包括INFO、DEBUG、ERROR等;『%m』是MSG,日誌內容。注意這里的參數區分大小寫。 log4j.appender.db.layout=org.apache.log4j.PatternLayout 通過上面的配置,現在再啟動服務,LOG4J就會自動把原來存儲在.LOG文件中的信息,同時存儲到資料庫了
G. 如何查看mysql資料庫操作記錄日誌
一.錯誤日誌
錯誤日誌在Mysql資料庫中很重要,它記錄著mysqld啟動和停止,以及伺服器在運行過程中發生的任何錯誤的相關信息。
1.配置信息
--log-error=[file-name]用來指定錯誤日誌存放的位置。
如果沒有指定[file-name],默認hostname.err做為文件名,默認存放在DATADIR目錄中。
也可以將log-error配置到my.cnf文件中,這樣就省去了每次在啟動mysqld時都手工指定--log-error.例如:
[mysql@test2]$ vi /etc/my.cnf
# The MySQL server
[mysqld]
....
log-error = /var/lib/mysql/test2_mysqld.err
.....
2.錯誤信息樣板
080313 05:21:55 mysqld started
080313 5:21:55 InnoDB: Started; log sequence number 0 43655
080313 5:21:55 [Note] /usr/local/mysql/bin/mysqld: ready for connections.
Version: '5.0.26-standard-log' socket: '/var/lib/mysql/mysql.sock' port: 3306 MySQL Community Edition - Standard (GPL)
080313 5:24:13 [Note] /usr/local/mysql/bin/mysqld: Normal shutdown
080313 5:24:13 InnoDB: Starting shutdown...
080313 5:24:16 InnoDB: Shutdown completed; log sequence number 0 43655
080313 5:24:16 [Note] /usr/local/mysql/bin/mysqld: Shutdown complete
080313 05:24:16 mysqld ended
080313 05:24:47 mysqld started
080313 5:24:47 InnoDB: Started; log sequence number 0 43655
080313 5:24:47 [Note] /usr/local/mysql/bin/mysqld: ready for connections.
Version: '5.0.26-standard-log' socket: '/var/lib/mysql/mysql.sock' port: 3306 MySQL Community Edition - Standard (GPL)
080313 5:33:49 [Note] /usr/local/mysql/bin/mysqld: Normal shutdown
三.查詢日誌
查詢日誌記錄了clinet的所有的語句。
Note:由於log日誌記錄了資料庫所有操作,對於訪問頻繁的系統,此種日誌會造成性能影響,建議關閉。
1.配置信息
--log=[file-name]用來指定錯誤日誌存放的位置。
如果沒有指定[file-name],默認為主機名(hostname)做為文件名,默認存放在DATADIR目錄中。
也可以將log配置到my.cnf文件中,這樣就省去了每次在啟動mysqld時都手工指定--log.例如:
# The MySQL server
[mysqld]
......
#query-log
log = /var/lib/mysql/query_log.log
......
2.讀取查詢日誌
查詢日誌是純文本格可,可以使用OS文本讀取工具直接打開查看。例如:
[mysql@test2]$ tail -n 15 query_log.log
080313 7:58:28 17 Query show tables
080313 8:07:45 17 Quit
080313 10:01:48 18 Connect root@localhost on
080313 10:02:38 18 Query SELECT DATABASE()
18 Init DB test
080313 10:02:42 18 Query show tables
080313 10:03:07 18 Query select * from pet
080313 10:06:26 18 Query insert into pet values('hunter','yxyup','cat','f','1996-04-29',null)
080313 10:06:39 18 Query select * from pet
080313 10:07:13 18 Query update pet set sex='m' where name='hunter'
080313 10:07:38 18 Query delete from pet where name='hunter'
080313 10:13:48 18 Query desc test8
080313 10:14:13 18 Query create table t1(id int,name char(10))
080313 10:14:41 18 Query alter table t1 add sex char(2)
[mysql@test2]$
四.慢查詢日誌
慢查詢日誌是記錄了執行時間超過參數long_query_time(單位是秒)所設定值的SQL語句日誌。
Note:慢查詢日誌對於我們發現性能有問題的SQL有很幫助,建議使用並經常分析
1.配置信息
--log-slow-queries=[file-name]用來指定錯誤日誌存放的位置。
如果沒有指定[file-name],默認為hostname-slow.log做為文件名,默認存放在DATADIR目錄中。
也可以將log-slow-queries配置到my.cnf文件中,這樣就省去了每次在啟動mysqld時都手工指定--log-slow-queries.例如:
# The MySQL server
[mysqld]
......
#slow-query-log
log-slow-queries = /var/lib/mysql/slow_query_log.log
......
2.讀取慢查詢日誌
[mysql@test2]$ cat slow_query_log.log
/usr/local/mysql/bin/mysqld, Version: 5.0.26-standard-log. started with:
Tcp port: 3306 Unix socket: /var/lib/mysql/mysql.sock
Time Id Command Argument
# Time: 080313 5:41:46
# User@Host: root[root] @ localhost []
# Query_time: 108 Lock_time: 0 Rows_sent: 0 Rows_examined: 8738
use test;
select count(1) from t1 a, t1 b,t1 c where a.id=b.id and b.name=c.name;
# Time: 080313 5:52:04
# User@Host: root[root] @ localhost []
# Query_time: 583 Lock_time: 0 Rows_sent: 0 Rows_examined: 508521177
select count(1) from t1 a, t1 b where a.id=b.id;
/usr/local/mysql/bin/mysqld, Version: 5.0.26-standard-log. started with:
Tcp port: 3306 Unix socket: /var/lib/mysql/mysql.sock
Time Id Command Argument
# Time: 080313 10:39:59
# User@Host: root[root] @ localhost []
# Query_time: 11 Lock_time: 0 Rows_sent: 4537467 Rows_examined: 4537467
use test;
select id from tail;
如果慢查詢日誌記錄很多可以使用mysqlmpslow進行分類匯總
[mysql@test2]$ mysqlmpslow slow_query_log.log
Reading mysql slow query log from slow_query_log.log
Count: 1 Time=583.00s (583s) Lock=0.00s (0s) Rows=0.0 (0), root[root]@localhost
select count(N) from t1 a, t1 b where a.id=b.id
Count: 1 Time=108.00s (108s) Lock=0.00s (0s) Rows=0.0 (0), root[root]@localhost
select count(N) from t1 a, t1 b,t1 c where a.id=b.id and b.name=c.name
Count: 1 Time=11.00s (11s) Lock=0.00s (0s) Rows=4537467.0 (4537467), root[root]@localhost
select id from tail;
mysql有以下幾種日誌:
錯誤日誌: -log-err
查詢日誌: -log
慢查詢日誌: -log-slow-queries
更新日誌: -log-update
二進制日誌: -log-bin
在mysql的安裝目錄下,打開my.ini,在後面加上上面的參數,保存後重啟mysql服務就行了。
例如:
#Enter a name for the binary log. Otherwise a default name will be used.
#log-bin=
#Enter a name for the query log file. Otherwise a default name will be used.
#log=
#Enter a name for the error log file. Otherwise a default name will be used.
log-error=
#Enter a name for the update log file. Otherwise a default name will be used.
#log-update=
查看日至:
1. 首先確認你日誌是否啟用了
mysql>show variables like 'log_bin';
如果啟用了,即ON
那日誌文件就在mysql的安裝目錄的data目錄下
cat/tail 日誌文件名
2. 怎樣知道當前的日誌
mysql> show master status;
3. 查看從某一段時間到某一段時間的日誌
mysqlbinlog --start-datetime='2008-01-19 00:00:00'
--stop-datetime='2008-01-30 00:00:00' /var/log/mysql/mysql-bin.000006
> mysqllog1.log
H. 如何查詢oracle資料庫操作日誌記錄
方法1:使用LogMiner工具
優點:可以完全挖掘日誌內容,找出所有執行過的SQL語句
缺點:
1. 如果沒有啟用歸檔日誌,則只能對聯機日誌進行挖掘
2. 需要掌握LogMiner的用法
訪法2:查看HIST視圖
優點:簡單,只要使用普通的select語句查詢
缺點:Oracle保留約1周的歷史,所以要查太早的就不可能了
-- 找出哪個資料庫用戶用什麼程序在最近三天執行過delete或truncate table的操作
舉例如下:
SELECT c.username,
a.program,
b.sql_text,
b.command_type,
a.sample_time
FROM dba_hist_active_sess_history a
JOIN dba_hist_sqltext b
ON a.sql_id = b.sql_id
JOIN dba_users c
ON a.user_id = c.user_id
WHERE a.sample_time BETWEEN SYSDATE - 3 AND SYSDATE
AND b.command_type IN (7, 85)
ORDER BY a.sample_time DESC;