Mysql数据库事务的作用、及数据库日志分类、慢查询、乱码解决方案。

一、mysql事务:

Mysql事务是作为单个逻辑工作单元执行的一系列操作,要么完整地执行、要么完全步执行,正常情况下,这些操作将顺利的进行,最终操作成功,但是,如果在这一系列过程中任何一个环节出了差错,数据库中所有信息都必须保持第一步操作前的状态,mysql事务是一个整体一般使用在(金融、银行、保险及证券交易等地方。)
1.2事务的概念:
事务是一种机制,一个操作系列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行,事务是一个不可用分割的工作逻辑单元,在数据库系统上执行并发操作时事务是最小的控制单元,事务是保证了一组操作的平稳性和可预测性的技术。
1.3事务的ACID特征:(事务具体有四个特性:原子性 ,一致性,隔离性,持久性,)

(1)原子性:事务是一个完整地操作,各元素是不可分的,即原子的,事务中的所有元素必须作为一个整体提交或回滚,如果事务中任何元素失败,则整个事务将失败。

(2)一致性:当事务完成时,数据必须处于一致状态,在事务开始之前,数据库中存储的数据处于一致状态,在在在进行的事务中,数据可能处于不一致状态;当事务完成时,数据必须再次回到已知的一致状态。

(3)隔离性:对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务,修改数据的事务可以在另一个使用相同数据的事务开始之前访问这些数据,或者在另外一个使用相同数据的事务结束之后访问这些数据。

(4)持久性:值不管系统是否发生故障,事务处理的结果都是永久的,一旦事务被提交,事务的效果会被永久地保留在数据库中、

1.4:事务的操作
Mysql数据库的事务是默认自动提交,之前我们用SQL操作数据库时,一条语句执行后,系统会自动执行事务提交。当需要把一组语句作为一个事务提交时,需要手动对事务进行控制,手动控制事务有两种方法,一种是使用事务处理命令控制,二种是使用set设置事务的处理方式。

1.4.1:使用事务命令控制事务
Mysql中使用命令控制事务需要用到三个命令
(1)begin:表示开始一个事务,后面会有多条数据库操作语句执行。
(2)Commit:表示提交一个事务,对应前面的begin操作,他们之间的数据库操作语句一起完成。
(3)Rollback:表示回滚一个事务,在begin和commit之间,如果某一个数据库操作语句出现错误,执行rollback回滚,数据库回到begin之前的状态,也就操作语句都没有执行 。

mysql> begin;  //begin就是表示一个事务的开始
Query OK, 0 rows affected (0.00 sec)
mysql> insert into sys.IT_salary values('ngxin工程师','小王','18','.大专','10','12000');
Query OK, 1 row affected (0.00 sec)

mysql> insert into sys.IT_salary values('apache工程师','小李','20','大专','9','15000');
Query OK, 1 row affected (0.00 sec)

mysql> commit;//表示提交一个事务、如果这里改成为rollback回滚就直接恢复到插入数据前的状态。
Query OK, 0 rows affected (0.01 sec)

mysql> select * from IT_salary;
+---------------------+-----------+----+--------+--------+--------+
| type                | name      | id | degree | yeares | salary |
+---------------------+-----------+----+--------+--------+--------+
| 网络工程师          | 孙悟空    | 11 | 本科   |      3 |   4800 |
| Windows工程师       | 蓝凌      | 12 | 中专   |      2 |   3500 |
| Linux工程师         | 姜纹      | 13 | 本科   |      8 |  15000 |
| java软件工程师      | 关园      | 14 | 大专   |     10 |  16000 |
| 网络工程师          | 张三      | 15 | 大专   |      3 |   5000 |
| LINUX工程师         | 李四      | 16 | 本科   |      1 |   6000 |
| ngxin工程师         | 小王      | 18 | 大专   |     10 |  12000 |
| apache工程师        | 小李      | 20 | 大专   |      9 |  15000 |
+---------------------+-----------+----+--------+--------+--------+
8 rows in set (0.00 sec)

1.4.2使用set设置控制事务。
前面已经提到了mysql默认是自动提交事务,也可以修改为不自动提交,

使用set命令操作:
Set autocommit = 0 :禁止自动提交事务
Set autocommit = 1 :开启自动提交事务。
使用set autocommit = 0 设置禁止自动提交,最后使用commit提交事务。

二、 Mysql日志管理

Mysql的日志类型有错误日志、通用查询日志、二进制日志和慢查询日志、

1.错误日志
(1)错误日主要是记录当mysql启动和停止时、以及在运行过程中发生任何错误时的相关信息。错误日志默认保存在mysql的安装路径(数据存储文件)data文件下,后缀名为.err。//如果没有配置会在mysql文件下生成一个主机名+.err文件

[root@kgc1 ~]# cd /data/mysql
[root@kgc1 mysql]# ls
auto.cnf         ibtmp1            mysql-bin.000003  mysql-bin.000013  mysql_error.err
ca-key.pem       kgc1-bin.000001   mysql-bin.000004  mysql-bin.000014  mysql.sock
ca.pem           kgc1-bin.000002   mysql-bin.000005  mysql-bin.000015  mysql.sock.lock
client-cert.pem  kgc1-bin.000003   mysql-bin.000006  mysql-bin.000016  performance_schema
client-key.pem   kgc1-bin.index    mysql-bin.000007  mysql-bin.000017  private_key.pem
db               kgc1.err          mysql-bin.000008  mysql-bin.000018  public_key.pem
ib_buffer_pool   kgc1.pid          mysql-bin.000009  mysql-bin.000019  server-cert.pem
ibdata1          mysql             mysql-bin.000010  mysql-bin.000020  server-key.pem
ib_logfile0      mysql-bin.000001  mysql-bin.000011  mysql-bin.000021  sys
ib_logfile1      mysql-bin.000002  mysql-bin.000012  mysql-bin.index
[root@kgc1 mysql]# 

在这里插入图片描述

(2)在mysql的配置文件中,可以指定日志文件的保存位置和日志的名字、log-error=file_name(日志文件名字自定义的)选项来指定保存错误日志的位置。

[root@kgc1 mysql]# vim /etc/my.cnf

[client]
port        = 3306
socket      = /data/mysql/mysql.sock
default-character-set=utf8
[mysqld]
port        = 3306
socket      = /data/mysql/mysql.sock
user = mysql

basedir = /usr/src/mysql
datadir = /data/mysql

skip-external-locking
key_buffer_size = 32M
max_allowed_packet = 1024M
table_open_cache = 128
sort_buffer_size = 768K
net_buffer_length = 8K
read_buffer_size = 768K

read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
thread_cache_size = 16
query_cache_size = 16M
tmp_table_size = 32M
performance_schema_max_table_instances = 1000

explicit_defaults_for_timestamp = true
#skip-networking
max_connections = 500
max_connect_errors = 100
open_files_limit = 65535

log_bin=mysql-bin
binlog_format=mixed
server_id   = 232
expire_logs_days = 10
early-plugin-load = ""

default_storage_engine = InnoDB
innodb_file_per_table = 1
innodb_buffer_pool_size = 128M
innodb_log_file_size = 32M
open_files_limit = 65535

log_bin=mysql-bin
binlog_format=mixed
server_id   = 232
expire_logs_days = 10
early-plugin-load = ""

default_storage_engine = InnoDB
innodb_file_per_table = 1
innodb_buffer_pool_size = 128M
innodb_log_file_size = 32M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50
log-error=/data/mysql/mysql_error.err //配置错误日志文件的位置及文件名字
#general log=ON
#general_log_file=/data/mysql/mysql_general.log
log_bin=kgc1-bin

在这里插入图片描述
重启,mysql后,生成mysql_error.err文件来记录错误日志
在这里插入图片描述
需要注意的是:mysql必须对指定文件夹有读写的权限,否则无法操作文件。

2.通用查询日志//默认是关闭的原因会占用myslq的资源很多
(1)通用查询日志用来记录mysql的所有连接语句,默认是关闭的,使用SHOW 语句可以查询日志信息。

mysql> show variables like'general%';
+------------------+----------------------+
| Variable_name    | Value                |
+------------------+----------------------+
| general_log      | OFF                  |
| general_log_file | /data/mysql/kgc1.log |
+------------------+----------------------+
2 rows in set (0.01 sec)

gengeral_log对应的是通用查询日志,它的值是OFF,表示是关闭的。
(2)修改mysql的配置文件general_log=ON 选项,可以打开通用查询日志,general_log
_file=file_name(自定义通用查询日志的位置文件名),如果没有指定file_name的值默认名是host(主机)_name.log

[root@kgc1 mysql]# vim /etc/my.cnf
#general log=ON
#general_log_file=/data/mysql/mysql_general.log

(3)重启mysql服务后,通用查询日志生效。

[root@kgc1 mysql]# systemctl restart mysqld
[root@kgc1 mysql]# ls
 mysql_general.log

3.二进制日志
(1)二进制日志用来记录所有更新了数据或者潜在更新了数据的语句(保存的是数据库的增,删,改,查,数据库备份及恢复的时候需要它),记录了数据的更改、主要目的是恢复数据时能够最大程度地恢复数据库,二进制日志默认是开启的,在、data文件下以mysql-bin命名,数据量大时会自动分割成多个日志文件,以数字做为扩展名。
在这里插入图片描述
也可以在数据库的配置文件中修改日志存放路径日志文件名字;

[root@kgc1 mysql]# vim /etc/my.cnf
log_bin=kgc1-bin //自定义名字

(2)二进制日志可以使用mysql的工具mysqlbinlog查看二进制文件

[root@kgc1 mysql]# mysqlbinlog mysql-bin.000021(指定查看的二进制文件)      

4.慢查询日志

慢查询日志记录所有执行时间超过long_quer_time秒的SQL语句,用于找到那些语句执行的时间长,以便对其进行优化,默认慢查询日志是关闭的slow_query_log是慢查询的选项,默认是OFF。

mysql> show variables like'%slow%';
+---------------------------+---------------------------+
| Variable_name             | Value                     |
+---------------------------+---------------------------+
| log_slow_admin_statements | OFF                       |
| log_slow_slave_statements | OFF                       |
| slow_launch_time          | 2                         |
| slow_query_log            | OFF             状态为OFF          |
| slow_query_log_file       | /data/mysql/kgc1-slow.log |
+---------------------------+---------------------------+
5 rows in set (0.00 sec)

(1)可以使用SQL语句开启慢查询功能、

mysql> set global slow_query_log=ON;//开启慢查询功能
Query OK, 0 rows affected (0.03 sec)

mysql> show variables like'%slow%';
+---------------------------+---------------------------+
| Variable_name             | Value                     |
+---------------------------+---------------------------+
| log_slow_admin_statements | OFF                       |
| log_slow_slave_statements | OFF                       |
| slow_launch_time          | 2                         |
| slow_query_log            | ON               //ky可以看到这里为ON已经开启了         |
| slow_query_log_file       | /data/mysql/kgc1-slow.log |
+---------------------------+---------------------------+
5 rows in set (0.00 sec)

慢查询时间默认为10秒,记录10内的查询,可以通过global long_query_time选项进行修改。

mysql> show variables like 'long_query_time';//查看慢查询时间设置
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.00 sec)

mysql> set global long_query_time=5;//修改慢查询时间设置//全局级别修改,重新登录系统生效,重启失效。
Query OK, 0 rows affected (0.00 sec)

修改完成后面需要重新登录一下mysql然后使用 show variables like 'long_query_time'查询
mysql> show variables like'long_query_time';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 5.000000 |
+-----------------+----------+
1 row in set (0.00 sec)

全局级别修改修改后需要重新登录生效,重启失效的配置

会话级修改立即生效,重登录失效

mysql> set  long_query_time=10;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like'long_query_time';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.00 sec)

Select sleep(6);查询时休眠6秒用来测试

使用SHOW 语句查看慢查询日志已经开打,slow_query_log对应的值是ON。

mysql> show variables like'%slow%';
+---------------------------+---------------------------+
| Variable_name             | Value                     |
+---------------------------+---------------------------+
| log_slow_admin_statements | OFF                       |
| log_slow_slave_statements | OFF                       |
| slow_launch_time          | 2                         |
| slow_query_log            | ON              //状态码          |
| slow_query_log_file       | /data/mysql/kgc1-slow.log |
+---------------------------+---------------------------+
5 rows in set (0.00 sec)

(2)也可以在MYSQL的配置文件中进行设置,指定slow_query_log=ON选项启动慢查询功能,使用slow_query_log——file=filename指定存放慢查询日志位置,如果没有filename值,默认为hotname-slow.log,如果没有给出绝对路径,文件保存在data目录下long_query_time=1设置了超过1秒执行的语句被记录://但是一般不建议修改mysql的配置文件,此日志只是做优化功能日志。

[root@kgc1 mysql]# vim /etc/my.cnf
Slow_query_log=ON
Slow_query_log_file=mysql_slow_query.log
Long_query_time=1

重启MYSQL后。慢查询日志mysql_slow_query.log 被创建,检查检查,,慢查询日志,当有查询语句被记录,就需要对其进行优化处理了。

[root@kgc1 mysql]# ls
mysql_slow_query.log

5.数据乱码解决方案

Mysql乱码解决方法。
对于mysql服务器,只要设置存储的字符集为UTF-8,对应的客户端程序也使用相同编码,就不会产生乱码,mysql设置字符的方式有多钟。
1)在创建数据库时指定字符集,使用参数CHARACTER SET 设置字符集,COLLATE是对字符集进行校对的规则。

Mysql >create database chartest(创建一个chartset数据库)character set  ’utf8’ collate
‘utf8_general_ci’//指定utf8字符集。

(2)使用set names 也可以设置默认的字符集,但它是临时设置,mysql重启后失效。

Mysql > set names utf8;

(3)也可以直接修改mysql数据库配置文件指定字符集。

[root@kgc1 mysql]# vim /etc/my.cnf
[client]
default-character-set=utf8 //重启后生效
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值