正在创建MySql日志



Helllo,我的问题如下:使用php,是否可以创建一个与MySQL数据库的所有交互日志,该日志通常可以由phpMyadmin访问。有没有一个具体的问题或例子可以让我看看?谢谢你抽出时间。

有一种简单的方法可以捕获SQL日志。这个日志叫做普通日志。它捕获所有客户端执行的所有sql。

以启用常规日志。

mysql> SET GLOBAL general_log = 'ON';

日志位于哪里?

mysql> SHOW variables like '%general_log%';
+------------------+--------------------+
| Variable_name    | Value              |
+------------------+--------------------+
| general_log      | ON                 |
| general_log_file | /tmp/your_path.log |
+------------------+--------------------+

你想换个位置吗?

mysql> SET GLOBAL general_log_file = 'what you want';

关闭日志

mysql> SET GLOBAL general_log = 'OFF';

小心,一般日志会变大,测试完成后,请始终关闭日志

使用触发器命令。首先为特定表创建一个日志表,然后在其中插入所有触发器输出。

这是样品:

CREATE TABLE `sales_category` (
    `salescatid` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
    `salescatname` VARCHAR(128) NOT NULL,
    `salescatdesc` VARCHAR(512) NOT NULL,
    UNIQUE INDEX `salescatname` (`salescatname`),
    UNIQUE INDEX `salescatid` (`salescatid`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB

2. Create table for log
CREATE TABLE `category_log` (
    `action` ENUM('CREATE','UPDATE','DELETE') NULL DEFAULT NULL,
    `salescatid` INT(10) UNSIGNED NOT NULL,
    `salescatname` VARCHAR(255) NOT NULL,
    `salescatdesc` VARCHAR(255) NOT NULL,
    INDEX `id` (`salescatid`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB;
3. Add triggers
    //FOR ADD
    DELIMITER #
    CREATE TRIGGER ai_category
    AFTER INSERT ON sales_category
    FOR EACH ROW
    BEGIN
        INSERT INTO category_log(action,salescatid,salescatname,salescatdesc)
        VALUES('CREATE',NEW.salescatid,NEW.salescatname,NEW.salescatdesc);
    END;#

    //FOR UPDATE
    DELIMITER #
    CREATE TRIGGER au_category
    AFTER UPDATE ON sales_category
    FOR EACH ROW
    BEGIN
        INSERT INTO category_log(action,salescatid,salescatname,salescatdesc)
        VALUES('UPDATE',NEW.salescatid,NEW.salescatname,NEW.salescatdesc);
    END;#

    //FOR DELETE
    DELIMITER #
    CREATE TRIGGER ad_category
    AFTER DELETE ON sales_category
    FOR EACH ROW
    BEGIN
        INSERT INTO category_log(action,salescatid,salescatname,salescatdesc)
        VALUES('DELETE',OLD.salescatid,OLD.salescatname,OLD.salescatdesc);
    END;#

这就是你要找的吗?这是CRUD过程,但它是通过SQL命令完成的。如果你怎么称呼它,我认为你应该把它放在一个函数中。。我也是一个初学者,所以如果有bug,也请告诉我。祝你好运。

要启用查询日志,请将其放入[mysqld]部分的/etc/my.cnf

log   = /path/to/query.log

请记住,在繁忙的服务器上,此日志文件可能会变得很大

更新:

从mysql 5.1.12开始,您应该使用

general_log=1

对于mysql 5.1.29,不赞成使用log选项。要指定日志文件,请使用

general_log_file=/path/to/query.log

相反。看见http://dev.mysql.com/doc/refman/5.6/en/query-log.html

在数据库上启用查询日志记录(注意字符串"table"应按字面意思放置,而不是用任何表名替换)

SET global general_log = 1;
SET global log_output = 'table';

查看日志

select * from mysql.general_log

禁用数据库上的查询日志记录

SET global general_log = 0;

参考:http://www.jovicailic.org/2012/07/how-to-enable-general-query-log-in-mysql-under-linux/

最新更新