mysql和mysqlshell区别

mysql和mysqlshell区别,第1张

首选概括一下它的功能,MySQL Shell是一个统一的命令行客户端,使用它可以对MySQL进行管理和 *** 作。它支持多种语言,包括JavaScript,Python和SQL,并且支持编写脚本。此外,它同时支持文档型和关系型数据库模式,并且具有完整的开发和管理API。 看到这里,您可能会发现MySQL Shell与传统的MySQL数据库的客户端mysql的区别了

你还在被以下问题困扰吗:

MySQL 的安装规范中应该设置什么时区

JAVA 应用读取到的时间和北京时间差了14个小时,为什么?怎么解决?

已经运行一段时间的业务,修改 MySQL 的时区会影响已经存储的时间类型数据吗?

迁移数据时会有导致时间类型数据时区错误的可能吗?

...

看完这篇文章,你能解决上面所有的疑惑。首先出场的是和时区相关的启动参数和系统变量。

如果要在 MySQL 启动时就指定时区,则应该使用启动参数: default-time-zone ,示例:

启动后我们可以看到控制时区的系统变量,其中 time_zone 变量控制时区,在MySQL运行时可以通过 set 命令修改(注意:不可以写在 my.cnf 中):

启动参数和系统变量的可用值遵循相同的格式:

system_time_zone 变量只有全局值没有会话值,不能动态修改,MySQL 启动时,将尝试自动确定服务器的时区,并使用它来设置 system_time_zone 系统变量, 此后该值不变。当 time_zone='system' 时,就是使用的这个时区,示例中 time_zone 就是 CST,而 CST 在 RedHat 上就是东八区:

概括一下就两点:

1. NOW() 和 CURTIME() 系统函数的返回值受当前 session 的时区影响

不仅是select now(),包括insert .. values(now())、以及字段的 DEFAULT CURRENT_TIMESTAMP 属性也受此影响:

2. timestamp 数据类型字段存储的数据受时区影响

timestamp 数据类型会存储当时session的时区信息,读取时会根据当前 session 的时区进行转换;而 datetime 数据类型插入的是什么值,再读取就是什么值,不受时区影响。也可以理解为已经存储的数据是不会变的,只是 timestamp 类型数据在读取时会根据时区转换:

关于时区所有明面上的东西都在上面了,我们前面提到的困扰就是在暗处的经验。

1. MySQL的安装规范中应该设置什么时区?

对于国内的业务了,在 my.cnf 写入 default-time-zone='+08:00' `,其他地区和开发确认取对应时区即可。

为什么不设置为 system 呢?使用系统时间看起来也是个不错的选择,比较省事。不建议的原因有两点:

2. JAVA应用读取到的时间和北京时间差了14个小时,为什么?怎么解决?

这通常是 JDBC 参数中没有为连接设置时区属性(用 serverTimezone 参数指定),并且MySQL中没有设置全局时区,这样MySQL默认使用的是系统时区,即 CST。这样一来应用与MySQL 建立的连接的 session time_zone 为 CST ,前面我们提到 CST 在 RedHat 上是 +08:00 时区,但其实它一共能代表4个时区:

JDBC在解析CST时使用了美国标准时间,这就会导致时区错误。要解决也简单:一是遵守上面刚说到的规范,对MySQL显示的设置'+08:00'时区;二是JDBC设置正确的 serverTimezone。

3. 已经运行一段时间的业务,修改MySQL的时区会影响已经存储的时间类型数据吗?

完全不会,只会影响对 timestamp 数据类型的读取。这里不得不提一句,为啥要用 timestamp?用 datetime 不香吗,范围更大,存储空间其实差别很小,赶紧加到开发规范中吧。

4. 迁移数据时会有导致时间类型数据时区错误的可能吗?

这个还真有,还是针对 timestamp 数据类型,比如使用 mysqldump 导出 csv 格式的数据,默认这种导出方式会使用 UTC 时区读取 timestamp 类型数据,这意味导入时必须手工设置 session.time_zone='+00:00'才能保证时间准确:

如何避免?mysqldump 也提供了一个参数 --skip-tz-utc ,意思就是导出数据的那个连接不设置 UTC 时区,使用 MySQL 的 gloobal time_zone 系统变量值。

其实 mysqldump 导出 sql 文件时默认也是使用 UTC 时区,并且会在导出的 sql 文件头部带有 session time_zone 信息,这样可以保证导 SQL 文件导入和导出时使用相同的时区,从而保证数据的时区正确(而导出的 csv 文件显然不可以携带此信息)。需要注意的是 --compact 参数会去掉 sql 文件的所有头信息,所以一定要记得: --compact 参数得和 --skip-tz-utc 一起使用。

本文实例,运行于MySQL5.0

及以上版本。

MySQL

赋予用户权限命令的简单格式可概括为:

grant

权限on

数据库对象to

用户

一、grant

普通数据用户,查询、插入、更新、删除数据库中所有表数据的权利。

grant

select

on

testdb.*

to

common_user@'%'

grant

insert

on

testdb.*

to

common_user@'%'

grant

update

on

testdb.*

to

common_user@'%'

grant

delete

on

testdb.*

to

common_user@'%'

或者,用一条MySQL

命令来替代:

grant

select,

insert,

update,

delete

on

testdb.*

to

common_user@'%'

二、grant

数据库开发人员,创建表、索引、视图、存储过程、函数。。。等权限。

grant

创建、修改、删除MySQL

数据表结构权限。

grant

create

on

testdb.*

to

developer@'192.168.0.%'

grant

alter

on

testdb.*

to

developer@'192.168.0.%'

grant

drop

on

testdb.*

to

developer@'192.168.0.%'

grant

*** 作MySQL

外键权限。

grant

references

on

testdb.*

to

developer@'192.168.0.%'

grant

*** 作MySQL

临时表权限。

grant

create

temporary

tables

on

testdb.*

to

developer@'192.168.0.%'

grant

*** 作MySQL

索引权限。

grant

index

on

testdb.*

to

developer@'192.168.0.%'

grant

*** 作MySQL

视图、查看视图源代码权限。

grant

create

view

on

testdb.*

to

developer@'192.168.0.%'

grant

show

view

on

testdb.*

to

developer@'192.168.0.%'

grant

*** 作MySQL

存储过程、函数权限。

grant

create

routine

on

testdb.*

to

developer@'192.168.0.%'

--

now,

can

show

procedure

status

grant

alter

routine

on

testdb.*

to

developer@'192.168.0.%'

--

now,

you

can

drop

a

procedure

grant

execute

on

testdb.*

to

developer@'192.168.0.%'

三、grant

普通DBA

管理某个MySQL

数据库的权限。

grant

all

privileges

on

testdb

to

dba@'localhost'

其中,关键字“privileges”

可以省略。

四、grant

高级DBA

管理MySQL

中所有数据库的权限。

grant

all

on

*.*

to

dba@'localhost'

五、MySQLgrant

权限,分别可以作用在多个层次上。

1.

grant

作用在整个MySQL

服务器上:

grant

select

on

*.*

to

dba@localhost

--

dba

可以查询MySQL

中所有数据库中的表。

grant

all

on

*.*

to

dba@localhost

--

dba

可以管理MySQL

中的所有数据库

2.

grant

作用在单个数据库上:

grant

select

on

testdb.*

to

dba@localhost

--

dba

可以查询testdb

中的表。

3.

grant

作用在单个数据表上:

grant

select,

insert,

update,

delete

on

testdb.orders

to

dba@localhost

4.

grant

作用在表中的列上:

grant

select(id,

se,

rank)

on

testdb.apache_log

to

dba@localhost

5.

grant

作用在存储过程、函数上:

grant

execute

on

procedure

testdb.pr_add

to

'dba'@'localhost'

grant

execute

on

function

testdb.fn_add

to

'dba'@'localhost'

六、查看MySQL

用户权限

查看当前用户(自己)权限:

show

grants

查看其他MySQL

用户权限:

show

grants

for

dba@localhost

七、撤销已经赋予给MySQL

用户权限的权限。

revoke

跟grant

的语法差不多,只需要把关键字“to”

换成“from”

即可:

grant

all

on

*.*

to

dba@localhost

revoke

all

on

*.*

from

dba@localhost

八、MySQLgrant、revoke

用户权限注意事项

1.

grant,

revoke

用户权限后,该用户只有重新连接MySQL

数据库,权限才能生效。

2.

如果想让授权的用户,也可以将这些权限grant

给其他用户,需要选项“grant

option“

grant

select

on

testdb.*

to

dba@localhost

with

grant

option

这个特性一般用不到。实际中,数据库权限最好由DBA

来统一管理。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7245324.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-03
下一篇 2023-04-03

发表评论

登录后才能评论

评论列表(0条)

保存