MySQL数据库开启审计功能
来源:https://www.shuzhiduo.com/A/kvJ3wgegJg/
数据库审计主要用于监视并记录对数据库服务器的各类操作行为,并记入审计日志或数据库中以便日后进行跟踪、查询、分析,以实现对用户操作的监控和审计。审计是一项非常重要的工作,也是企业数据安全体系的重要组成部分。
1、查看General Log开启情况:执行SQL命令show variables like '%general_log%' ;可以看到默认general_log是OFF的
2、开启General Log: 执行SQL命令set global general_log=on 而后查看general_log打开了
3、验证:general_log打开后,所有SQL的访问都会记录在general_log_file指向的日志文件。
开启General Log只要用户执行了操作,无论对错,MySQL就会记录日志,这样的话日志量会非常庞大,对数据库效率有影响。所以我们一般不建议开启开功能,个别情况下可能会临时的开一段时间以供排查故障等使用。对于生产环境中任务繁重的MySOL数据库,启用审计会引起服务器的高昂成本,因此建议采用第三方数据库审计产品收集审计记录。
MYSQL变量的查看与修改
mysql变量存储位置:
information_schema.GLOBAL_VARIABLES
information_schema.SESSION_VARIABLES
-------------------------------------------
以下来源:https://wenku.baidu.com/view/f1a28bfa5322aaea998fcc22bcd126fff7055d69.html
MySQL的变量分为以下两种:
1)系统变量:配置MySQL服务器的运⾏环境,可以⽤show variables查看
2)状态变量:监控MySQL服务器的运⾏状态,可以⽤show status查看
系统变量系统变量按其作⽤域的不同可以分为以下两种:
1)分为全局(GLOBAL)级:对整个MySQL服务器有效
2)会话(SESSION或LOCAL)级:只影响当前会话
有些变量同时拥有以上两个级别,MySQL将在建⽴连接时⽤全局级变量初始化会话级变量,但⼀旦连接建⽴之后,全局级变量的改变不会影响到会话级变量。
查看系统变量的值
可以通过show vairables语句查看系统变量的值:
[sql]
mysql> show variables like 'log%';
mysql> show variables where Variable_name like 'log%' and value='ON';
注意:show variables优先显⽰会话级变量的值,如果这个值不存在,则显⽰全局级变量的值,当然你也可以加上GLOBAL或SESSION关键字
区别:
[sql]
show global variables;
show session/local variables;
修改系统变量的值:
在MySQL服务器启动后,如果需要修改变量的值,可以通过SET语句:
SET GLOBAL var_name = value;
SET @@GLOBAL.var_name = value;
SET SESSION var_name = value;
SET @@SESSION.var_name = value;
如果在变量名前没有级别限定符,表⽰修改会话级变量。
注意:和启动时不⼀样的是,在运⾏时设置的变量不允许使⽤后缀字母'K'、'M'等,但可以⽤表达式来达到相同的效果,如:
[sql] SET GLOBAL read_buffer_size = 2*1024*1024
这⾥⼀个容易把⼈搞蒙的地⽅是如果查询时使⽤的是show variables的话,会发现设置好像并没有⽣效,这是因为单纯使⽤show variables的话就等同于使⽤的是show session variables,查询的是会话变量,只有使⽤show global variables,查询的才是全局变量。
⽹络上很多⼈都抱怨说他们set global之后使⽤show variables查询没有发现改变,原因就在于混淆了会话变量和全局变量,如果仅仅想修改会话变量的话,可以使⽤类似set wait_timeout=10;或者set session wait_timeout=10;这样的语法。
状态变量
状态变量可以使我们及时了解MySQL服务器的运⾏状况,可以使⽤show status语句查看。
状态变量和相同变量类似,也分为全局级和会话级,show status也⽀持like匹配查询,⽐较⼤的不同是状态变量只能由MySQL服务器本⾝设置和修改,对于⽤户来说是只读的,不可以通过SET语句设置和修改它们。
-------------------------------------------
以下来源:
mysql查看和修改系统参数 http://chn520.cn/article_detail/1646102666592358
mysql 参数
MySQL提供了相当多的系统参数,涉及方方面面。我们可以使用show关键字来查看:
show variables like '%autocommit%';
或者
show status like '%xxx%';
修改参数值
mysql有一些参数是可以直接修改的,比如mysql的自动提交是默认开启,我们修改为关闭自动提交
set autocommit = 1;
当然也有些系统参数不能直接修改里面的值,当我们修改时会报错,就像这样:
mysql> set @@ft_max_word_len = 1;
ERROR 1238 (HY000): Variable 'ft_max_word_len' is a read only variable
所以只能在配置文件中配置,配置参数后必须重启mysql方可生效
- windows版本的mysql配置文件为
my.ini
文件 - linux版本的mysql配置文件为
my.cnf
文件
[mysql] 参数说明
以下参数需要加到[mysql]下面
参数 | 说明 |
---|---|
datadir=/xxx/xxx | 数据文件存放目录 |
socket=/xx/xx/mysql.socket | 本地连接文件,通过localhost来连接mysql需要用到的文件 |
pid_file | 存储mysql的pid,可通过此id杀死mysql进程 |
port=3306 | mysql的端口号 |
default_storage_engine=Innodb | 存储引擎 |
skip_grant_tables | 使登录时跳过权限检查;登录mysql时,不需要密码就可以登录了:mysql -u root -p |
字符相关
参数 | 说明 |
---|---|
character_set_client=GBK | 客户端字符集 |
character_set_connection | 处理客户端发来信息的编码格式 |
character_set_database | 数据库默认的字符集 |
character_set_filesystem | 文件系统的编码格式,把操作系统上的文件名转化成此字符集,即把 character_set_client转换character_set_filesystem, 默认binary是不做任何转换的 |
character_set_results | mysql发送给客户端所用的字符集 |
character_set_server | mysql server 默认字符集,这个变量建议由系统自己管理,不要人为定义。 |
character_set_system | 数据库系统使用的编码格式,这个值一直是utf8,不需要设置,它是为存储系统元数据的编码格式。 |
连接相关(connection)
参数 | 说明 |
---|---|
max_connections | mysql最大连接数,默认151,可通过命令:show processlist 查看连接数量,一行就是一个连接 |
max_user_connections | 限制每个用户的连接个数,默认为0,0表示不限制 |
back_log | 注意这不是日志,这是用来暂存连接的数量大小,默认是80个,当mysql线程在一个很短时间内得到非常多的连接请求时,就会起作用,连接数量超过 max_connections 所设置的值,多出来的连接就会存放到back_log中,当back_log也存不下时,就会拒接掉新的连接; |
wait_timeout | mysql在关闭一个长连接(非交互式连接)之前需要等待的时长 |
interactive_timeout | 关闭一个短连接(交互式连接)需要等待的秒数 |
日志相关(log)
参数 | 说明 |
---|---|
log_error | 指定错误日志文件名称和存放路径,用于记录mysql启动和停止时、以及服务器在运行中出现严重错误时的相关信息 |
log_bin | 指定二进制日志文件名称和路径,用于记录所有对数据更改的sql语句;默认是关闭的,使用主从复制时,这个开关一定要开启。另外,如果数据丢失了,可通过此文件恢复数据,所以说,建议随时开启这个开关;只要配上路径就会自动打开:log-bin=/bin/mysql.bin |
binlog_do_db | 指定更新到二进制日志的库,比如我指定binlog_do_db=test ,就只会将test库中的数据记录到二进制日志中,其他库都不记录,如果要设置多个库,就得分2行来配置:binlog_do_db=test ,binlog_do_db=xx |
binlog_ignore_db | 指定不记录到二进制日志的库, |
sync_binlog | 指定多少次写日志后同步磁盘,用户修改数据后,会先将日志存在缓存中,每隔一段时间将缓存中的数据同步到磁盘中进行持久化存储; |
general_log | 是否开启查询日志记录,默认关闭 |
general_log_file | 查询日志记录文件存放地址;记录所有的查询语句 |
slow_query_log | 是否开启慢查询日志记录 |
slow_query_log_file | 指定慢查询日志文件名称, 用于记录耗时比较长的查询语句 |
long_query_time | 设置慢查询的时间,超过这个时间的查询语句就会被记录到show_query_log指定的文件中, |
log_show_admin_statements | 是否将管理语句写入慢查询日志 |
缓存相关(cache)
参数 | 说明 |
---|---|
key_buffer_size | 索引缓存区大小,只对myisam起作用,默认8M,一般情况下,默认值够用了 |
query_cache_size | 查询缓存大小,mysql8.0以上版本已被删除<br> show status like '%Qcache%' 查看缓存的相关属性<br> Qcache_free_blocks :缓存中相邻内存块的个数,如果值比较大,那么查询缓存中碎片比较多<br> Qcache_free_memory :查询缓存中剩余的内存大小<br> Qcachae_hits :表示有多少次命中缓存<br> Qcache_inserts :表示多少次未命中而插入<br> Qcache_lowmen_prunes :多少条query因为内存不足而被移除出cache<br> Qcache_queries_in_cache :当前cache中缓存的query数量<br> Qcache_total_blocks :当前cache中block的数量 |
query_cache_limit | 超过此大小将不被缓存 |
query_cache_min_res_unit | 缓存块最小值 |
query_cache_type | 缓存类型,决定缓存什么样的查询,默认是关闭的,一共有三个值 <br>0 :禁用<br>1 :将缓存所有的结果,除非sql中使用sql_no_cache禁用查询缓存<br>2 :只缓存select语句中通过sql_cache指定需要缓存的查询 |
sort_buffer_size | 每个线程需要排序的线程分配该大小的缓冲区 |
max_allowed_packet=32M | 限制server接收的数据包大小 |
join_buffer_size=2M | 表示关联缓存的大小,join连表没有索引的时候会使用的缓存 |
thread_cache_size | 这个和java的线程池很像,就是线程在用完之后不会马上销毁,而是先存起来,下次可以直接使用,省去了开启线程的开销<br>Threads_cached:代表当前此时此刻线程缓存中有多少空闲线程<br>Threads_connected:代表当前已建立连接的数量<br>Threads_created:代表最近一次服务驱启动,已创建线程的数量,如果该值比较大,那么服务器会一直再创建线程;<br>Threads_running:代表当前激活的线程数 |
innodb相关
参数 | 说明 |
---|---|
innodb_buffer_pool_size | 该参数可以设置指定大小的内存来缓冲数据和索引,最大可以设置为物理内存的80% |
innodb_flush_log_at_trx_commit | 主要控制innodb将log buffer中的数据写入日志文件并flush磁盘的时间点,值分别为:0,1,2 |
innodb_thread_concurreney | 设置innodb线程的并发数,设为0表示不限制,如果要设置建议设为cpu核心数一直,或者是cpu核心数的2倍 |
innodb_log_buffer_size | 此参数确定日志文件所用的内存大小,单位:M |
innodb_log_file_size | 此参数确定数据日志爱文件的大小,单位:M |
innodb_log_files_in_group | 以循环方式将日志文件写入到多个文件中 |
read_buffer_size | mysql读入缓冲区大小,对表进行顺序扫描的请求将分配到一个读入缓冲区 |
read_md_buffer_size | mysql随机读的缓存区大小 |
innodb_file_per_table | 此参数确定为每张表分配一个新的文件;默认开启,如果关闭了,创建表之后,将不会产生后缀为.ibd的文件,他的数据会存储到ibdata1这个表空间文件中;最好是一张表一张文件; |
-----------------------------------------------
以下转自:https://blog.csdn.net/weixin_28938171/article/details/113148529
MySQL数据库自带的INFORMATION_SCHEMA,MySQL,TEST三个数据库的用途。
第一个数据库INFORMATION_SCHEMA:
提供了访问数据库元数据的方式。
元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。有些时候用于表述该信息的其他术语包括"数据词典"和"系统目录"。
INFORMATION_SCHEMA是信息数据库,其中保存着关于MySQL服务器所维护的所有其他数据库的信息。在INFORMATION_SCHEMA中,有数个只读表。它们实际上是视图,而不是基本表,因此,你将无法看到与之相关的任何文件。
每位MySQL用户均有权访问这些表,但仅限于表中的特定行,在这类行中含有用户具有恰当访问权限的对象。
第二个数据库mysql:
这个是mysql的核心数据库,类似于sql server中的master表,主要负责存储数据库的用户、权限设置、关键字等mysql自己需要使用的控制和管理信息。不可以删除,如果对mysql不是很了解,也不要轻易修改这个数据库里面的表信息。
第三个数据库是test:
这个是安装时候创建的一个测试数据库,和它的名字一样,是一个完全的空数据库,没有任何表,可以删除。
大家在安装或使用MYSQL时,会发现除了自己安装的数据库以外,还有一个 information_schema数据库。information_schema数据库是做什么用的呢,使用WordPress博客的朋友可能会想,是不是安装模板添加的数据库呀?看完本片文章后,你就会对information_schema数据库有所了解。
information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式。什么是元数据呢?元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。有些时候用于表述该信息的其他术语包括"数据词典"和"系统目录"。
在 MySQL中,把 information_schema 看作是一个数据库,确切说是信息数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。在INFORMATION_SCHEMA中,有数个只读表。它们实际上是视图,而不是基本表,因此,你将无法看到与之相关的任何文件。
information_schema数据库表说明:
SCHEMATA表:提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。
TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。
COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。
STATISTICS表:提供了关于表索引的信息。是show index from schemaname.tablename的结果取之此表。
USER_PRIVILEGES(用户权限)表:给出了关于全程权限的信息。该信息源自mysql.user授权表。是非标准表。
SCHEMA_PRIVILEGES(方案权限)表:给出了关于方案(数据库)权限的信息。该信息来自mysql.db授权表。是非标准表。
TABLE_PRIVILEGES(表权限)表:给出了关于表权限的信息。该信息源自mysql.tables_priv授权表。是非标准表。
COLUMN_PRIVILEGES(列权限)表:给出了关于列权限的信息。该信息源自mysql.columns_priv授权表。是非标准表。
CHARACTER_SETS(字符集)表:提供了mysql实例可用字符集的信息。是SHOW CHARACTER SET结果集取之此表。
COLLATIONS表:提供了关于各字符集的对照信息。
COLLATION_CHARACTER_SET_APPLICABILITY表:指明了可用于校对的字符集。这些列等效于SHOW COLLATION的前两个显示字段。
TABLE_CONSTRAINTS表:描述了存在约束的表。以及表的约束类型。
KEY_COLUMN_USAGE表:描述了具有约束的键列。
ROUTINES表:提供了关于存储子程序(存储程序和函数)的信息。此时,ROUTINES表不包含自定义函数(UDF)。名为"mysql.proc name"的列指明了对应于INFORMATION_SCHEMA.ROUTINES表的mysql.proc表列。
VIEWS表:给出了关于数据库中的视图的信息。需要有show views权限,否则无法查看视图信息。
TRIGGERS表:提供了关于触发程序的信息。必须有super权限才能查看该表。
MYSQL创建用户并指定一个数据库、修改用户密码
参考:https://www.jianshu.com/p/b38255b96006
添加用户
方法一:
create user '用户名'@'本机名' indentified by '密码' grant all(权限) on 数据库名.*(表) '用户名'@'本机名' indentified by '密码'
方法二:
/*添加新用户test_usr*/ USE mysql; INSERT INTO USER(`Host`,`User`,`Password`, `ssl_cipher`, `x509_issuer`, `x509_subject`) VALUES('%','test_usr',PASSWORD('test_pwd'),'','',''); FLUSH PRIVILEGES; /*给test_usr赋予数据库test_db的管理权*/ GRANT ALL PRIVILEGES ON test_db.* TO test_usr@`%`; FLUSH PRIVILEGES;
方法三:
/*直接添加新用户text_usr,密码为test_pwd,并赋予数据库test_db的管理权*/ GRANT ALL PRIVILEGES ON test_db.* TO test_usr@'%' IDENTIFIED BY 'test_pwd'; FLUSH PRIVILEGES;
IDENTIFIED BY 'test_pwd' 表示用户不存在时自动添加,并设置密码为test_pwd
/*单独指定权限权限*/ GRANT SELECT ON test_db.* TO test_usr@`%`; GRANT UPDATE ON test_db.* TO test_usr@`%`; GRANT DELETE ON test_db.* TO test_usr@`%`; GRANT INSERT ON test_db.* TO test_usr@`%`; /*或*/ GRANT select,update,delete,insert ON test_db.* TO test_usr@`%`;
MYSQL创建远程管理员
CREATE USER '账号'@'%' IDENTIFIED BY '密码'; GRANT ALL PRIVILEGES ON *.* TO '账号'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;
删除用户
方法一 删除用户同时删除与之对应的管理权限
DROP USER test_usr@`%`; FLUSH PRIVILEGES;
方法二
/*删除用户*/ DELETE FROM mysql.user WHERE Host = '%' AND User = 'test_usr'; /*删除此用户管理的数据库管理权限(管理的数据库本身不变)*/ DELETE FROM mysql.db WHERE Host='%', User='test_usr'; FLUSH PRIVILEGES;
操作权限列表
修改密码
方法一:使用 SET PASSWORD 命令
mysql -u root -p set password form root@localhost=password('新密码');
方法二:UPDATE直接编辑user表,然后刷新权限
update mysql.user set `password`=password('新密码') where user='用户名' and Host ='localhost'; flush privileges;
mysql批量删除以某字符串开头的表
SELECT 'SET FOREIGN_KEY_CHECKS = 0;' UNION SELECT CONCAT( 'drop table ', table_name, ';' ) FROM information_schema.tables WHERE table_schema='数据库名' AND table_name LIKE '表前缀%' UNION SELECT 'SET FOREIGN_KEY_CHECKS = 1;'
复制生成的结果,执行之!
MYSQL查看数据表最后更新时间
查看所有表最后更新时间
SELECT `TABLE_NAME`, `UPDATE_TIME` FROM `information_schema`.`TABLES` WHERE `information_schema`.`TABLES`.`TABLE_SCHEMA` = 'DB_NAME';
查看单个表最后更新时间
SELECT `TABLE_NAME`, `UPDATE_TIME` FROM `information_schema`.`TABLES` WHERE `information_schema`.`TABLES`.`TABLE_SCHEMA` = 'DB_NAME' AND `information_schema`.`TABLES`.`TABLE_NAME` = 'TABLE_NAME';
SQLyog、phpMyAdmin、Navicat 三大常用MySQL数据库管理工具
1,SQLyog是一个易于使用的、快速而简洁的图形化管理MYSQL数据库的工具,它能够在任何地点有效地管理你的数据库,简单便捷。
2,phpmyadmin是一个用PHP编写的,可以通过互联网控制和操作MySQL。通过phpMyAdmin可以完全对数据库进行操作,例如建立、复制/删除数据等等。 管理 MySQL-server 以及单一数据库的 PHP 程序,对于不熟悉 MySQL 命令列指令的人来说,是很方便的管理工具。
3,navicat是一个强大的MySQL数据库管理和开发工具,从8.0发展至今,一直都是开发人员的利器,和web版本的phpmyadmin相比,速度快,操作方便等优势严重胜出。
MSSQL SERVER服务器间数据库导入
两边版本不一致,不能使用bak文件恢复;
任务》导入数据,导入后字段自增属性丢失;
…………
网上解决方法五花八门,但都不具通用性,至于升级重装数据库就更可怕了。今天经过几十次尝试,终于找了简单可行的通用方法,简单说就是:先建表,再导入数据。具体步骤如下:
1、生成脚本:源数据库 》 任务 》 生成脚本 》 选择数据库 》 选择脚本选项(默认即可) 》 选择对象类型(全选) 》 选择表、选择视图等都全选 》 输出选项,按自己喜好输出吧,我选的"保存到文件"。
2、建表:目标数据库 》 新建查询 》 粘贴上上一步生成的脚本,执行,建表(查询)完成。
3、导入数据:目标数据库 》 任务 》 导入数据 》 选择数据源,数据源类型 Microsoft OLE DB Provider for SQL Server,填入数据库地址、账号、密码,选择数据库 》 选择目标 》 指定表复制或查询,选择"复制一个或多个表或视图的数据 》 选择表和源视图,注意:这里只选择表,不要选视图(切记切记),编辑映射选中"启用标识插入" 》 保存并运行包 》 完成该向导,点完成。
OK,大功告成!
DOS下重启、暂停MYSQL、MSSQL SERVER语句
net stop mysql
net start mysql
net start mssqlserver
net stop mssqlserver
Incorrect string value: '\xF0\x9F\x98\xAD",...' for column...的解决方法
最近在微信开发时遇到以下错误:
Incorrect string value: '\xF0\x9F\x90\xB3 \xE4...' for column 'nickname' at row 69302
原因:用户昵称中有emoji表情,而emoji表情为4字节utf-8字符,mysql只支持不超过3字节的utf-8字符,所以写入失败。
4字节utf-8字符包括Emoji表情(Emoji 是一种特殊的 Unicode 编码,常见于 iOS 和 Android 手机上),和一些不常用的汉字,以及任何新增的 Unicode 字符等等。
MySQL 版本>=5.5.3支持utf8mb4编码,使用这个编码可以支持4字节utf-8字符。
MySQL低于5.5.3版本,可以过滤掉4字节字符,或采用base64_encode进行编码后保存,输出时再base64_decode解码。
/** * 过滤掉emoji表情(4字节utf8编码字符) */ function filter_emoji($str){ return preg_replace_callback('/./u', function(array $match){return strlen($match[0]) >= 4 ? '' : $match[0];}, $str); }
参考:
http://blog.csdn.net/yan791124465/article/details/70738939
http://blog.csdn.net/hzw19920329/article/details/55670782
http://blog.csdn.net/secretx/article/details/21253559
MySQL运算符优先级
常常发现很多基础的知识才是最重要的,是我们修复Bug的利器。
#MySQL运算符的优先级
运算符的优先级决定了不同的运算符在表达式中计算的先后顺序。
MySQL中所有运算符的优先级的顺序按照从高到低,从上到下,依次降低。一般情况下,级别高的运算符先进行计算,如果级别相同,MySQL按照表达式的顺序从左到右依次计算。
MySQL运算符的优先级如下:
优先级 运算符 (最高) ! 3 -(负号),~(按位取反) 4 ^(按位异或) 5 *,/(DIV),%(MOD) 6 +,- 7 >>,<< 8 & 9 | 10 =(比较运算),<=>,<,<=,>,>=,!=,<>,IN,IS NULL,LIKE,REGEXP 11 BETWEEN AND,CASE,WHEN,THEN,ELSE 12 NOT 13 &&,AND 14 XOR 15 ||,OR (最低) =(赋值运算),:=
我们可以看出,不同运算符的优先级是不同的。在无法确定优先级的情况下,可以使用圆括号()来改变优先级,并且这样会使计算过程更加清晰。