mysql安全加固关闭回滚日志(mysql 停止回滚)

网络安全 548
今天给各位分享mysql安全加固关闭回滚日志的知识,其中也会对mysql 停止回滚进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录一览: 1、卸载mysql时中出现回滚怎么办 该怎么解决

今天给各位分享mysql安全加固关闭回滚日志的知识,其中也会对mysql 停止回滚进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

卸载mysql时中出现回滚怎么办 该怎么解决

在MySQL有时执行了错误的update或者delete时导致大量数据错误恢复的办法。执行时没有开启事务,也没有对数据进行。这时就需要使用到sqlbinlog工具。

sqlbinlog需要开启,具体的打开方法就不说了。

使用sqlbinlog会产生bin文件,恢复就需要用到这些文件。文件中记录着数据库的所有操作。(此方法的操作是将数据库之前所执行的语句重新执行一次,以达到恢复效果)

具体步骤:1,先找到bin文件,一般都是在mysql的data文件夹中,结尾以.00000X等形式结束。

2,寻找需要还原的时间点 使用语句 mysqlbinlog 文件名 例(MySQLbinlog xxbin.000001)来查看内容,然后找到对应的具体时间

3,导出sql语句,使用语句 mysqlbinlog 文件名sql文件路径 例(mysqlbinlog xxxbin,00001a.sql | mysql -u root -p )

如果需要指定时间导出--start--date -stop='' --date='' 来导出指定时间执行的语句例(sqlbinlog --start-stop='2015-11-22 10:00:00' xxbin.000001a.sql | mysql -u root -p )这句意思是导出在2015-11-22 10点之前的语句,反之start是导出时间之后的。 start和stop可以同时使用。

如果存在多个bin文件,则按照需要导出。

4,使用mysql将导出的语句执行一次。

mysql 如何回滚事物是通过日志吗

你指的是事务回滚吗,mysql 的innodb和ndb引擎支持事务,默认事务自动提交, 使用事务回滚需要先关闭自动提交,set autocommit=off,这个是session级别的设置,每次重连需要重新设置 之后你就可以正常使用事务回滚了

如何做好MySQL安全策略

摘至网页链接

常见Mysql配置文件:linux系统下是my.conf,windows环境下是my.ini;

数据库整体安全需求:机密性、完整性、可用性;

下面以mysql 5.7版本为例,介绍mysql常见的安全策略、配置、加固方式等等,有些策略可能只针对Linux操作系统,更多策略可以参考CIS Mysql Benchmark相关文档:

1、操作系统级别安全配置

1.1不要将数据库放在系统分区

Windows系统:直接检查是否将数据库放置在C盘。

Linux系统:

在终端连接上mysql数据库,执行如下命令:

show variables where variable_name = 'datadir';

然后返回shell命令行:

df -h datadir

其中datadir是上一条命令的返回值。

上述命令的返回值不应是/、/var、/usr

1.2使用专用的最小权限账号运行mysql数据库进程

Windows系统:直接打开任务管理器,查看运行mysql进程的操作系统账号,不能为administrator账号。

Linux系统:

Shell命令行运行如下命令:

ps -ef | grep mysql

查看mysql服务的运行账号是否为root或其他高权限账号,如果是的,则需要创建一个非管理员专用账号来运行mysql服务。

1.3禁止使用mysql命令行历史记录

Linux系统:

执行如下命令:

find / -name ".mysql_history"

查看是否存在mysql的历史命令记录文件,如果存在,则需要进行如下加固:

(1)删除.mysql_history文件;

(2)设置环境变量MYSQL_HISTFILE为/dev/null,并添加到shell的初始化脚本中,创建mysql_history到/dev/null的链接:

ln -s /dev/null $HOME/.mysql_history

1.4 确保MYSQL_PWD环境变量未设置敏感信息

Windows系统下进入cmd命令行,使用如下命令:

Set

查看是否设置了环境变量MYSQL_PWD。

Linux系统下使用如下命令:

grep MYSQL_PWD /proc/*/environ

查看MYSQL_PWD环境变量是否设置了敏感信息。

确认那个配置文件或脚本设置了MYSQL_PWD环境变量。

2、安装

2.1使用数据库专用服务器

使用专用的服务器安装mysql服务可以减少mysql服务的攻击面,尽量卸载或删除操作系统上的不必要的应用或服务,减少其他应用的安装可能给mysql的运行带来的安全风险。

2.2 不要复用数据库账号

运行mysql服务的操作系统账号不要用来运行其他应用或服务,这样可以避免其他应用或服务器被攻击给mysql服务带来影响。

2.3 历史命令行密码设置为不可见

使用如下命令:

mysql -u admin -p password

连接mysql数据库服务,退出后查看历史命令,确认password是否为明文。

建议使用如下命令方式登录:

(1)先输入mysql -u admin -p

(2)根据命令行提示输入密码;

而不要在一整条命令中输入密码。

另外要控制mysql配置文件访问权限。

3、文件权限控制

3.1 控制数据目录的访问权限

数据目录是mysql数据库存放的位置,在mysql命令行界面下执行如下命令:

show variables where variable_name = 'datadir';

在终端命令行下执行如下命令:

ls -l datadir/.. | egrep "^d[r|w|x]{3}------\s*.\s*mysql\s*mysql\s*\d*.*mysql"

其中datadir是第一条命令的执行结果

如果存在问题,linux环境下在终端执行如下命令进行加固:

chmod 700 datadir

chown mysql:mysql datadir

3.2 控制二进制日志文件的权限

mysql的运行会产生很多日志,例如二进制日志、错误日志、慢查询日志等等,Mysql命令行下执行如下命令:

show variables like 'log_bin_basename';

在终端命令行执行如下命令:

ls log_bin_basename.*

对于发现的每一个文件,执行如下命令:

ls -l log_bin_basename.nnnnn | egrep "^-[r|w]{2}-[r|w]{2}----\s*.*$"

根据输出确认日志文件的权限设置是否存在问题。

对于每个日志文件,修改其权限和属组如下:

chmod 660 log file

chown mysql:mysql log file

3.3 控制错误日志文件的权限

Mysql命令行下执行如下命令:

show variables like 'log_error';

在终端命令行执行如下命令:

ls log_error.*

对于发现的每一个文件,执行如下命令:

ls -l log_error | egrep "^-[r|w]{2}-[r|w]{2}----\s*.*$"

根据输出确认日志文件的权限设置是否存在问题。

对于每个日志文件,修改其权限和属组如下:

chmod 660 log file

chown mysql:mysql log file

3.4控制慢查询日志文件的权限

Mysql命令行下执行如下命令:

show variables like 'slow_query_log_file';

在终端命令行执行如下命令:

ls slow_query_log_file.*

对于发现的每一个文件,执行如下命令:

ls -l slow_query_log_file | egrep "^-[r|w]{2}-[r|w]{2}----\s*.*$"

根据输出确认日志文件的权限设置是否存在问题。

对于每个日志文件,修改其权限和属组如下:

chmod 660 log file

chown mysql:mysql log file

3.5控制通用日志文件的权限

Mysql命令行下执行如下命令:

show variables like 'general_log_file';

在终端命令行执行如下命令:

ls general_log_file.*

对于发现的每一个文件,执行如下命令:

ls -l general_log_file | egrep "^-[r|w]{2}-[r|w]{2}----\s*.*$"

根据输出确认日志文件的权限设置是否存在问题。

对于每个日志文件,修改其权限和属组如下:

chmod 660 log file

chown mysql:mysql log file

3.6控制审计日志文件的权限

Mysql命令行下执行如下命令:

show global variables where variable_name =  'audit_log_file';

在终端执行如下命令:

ls -l audit_log_file | egrep "^-rw[-x]rw[-x][-r][-w][-x][ \t]*[0-9][ \t]*mysql[

\t]*mysql.*$"

根据输出确认日志文件的权限设置是否存在问题。

对于每个日志文件,修改其权限和属组如下:

chmod 660 audit_log_file

chown mysql:mysql audit_log_file

4、通用安全

4.1安装最新的补丁

在mysql命令行下查询MySQL的版本:

SHOW VARIABLES WHERE Variable_name LIKE "version";

确认是否由需要安装的补丁包,如果有请安装。

4.2 删除test数据库

Mysql数据库默认安装好后,存在一个名为test的数据库,如果存在,请执行如下命令删除:

Drop database “test”

4.3 确保读取本地文件的参数设置为失效

Mysql命令行下,使用如下命令:

SHOW VARIABLES WHERE Variable_name = 'local_infile';

查看结果是否为OFF。

如果该命令为ON,则数据库用户可以通过LOAD DATA INFILE 或者 SELECT local_file 读取到数据库所在操作系统本地的文件,在这种情况下,需要在mysql配置文件中新增一行:

Local-infile=0;

然后重启数据库服务。

5、权限配置

5.1控制可以访问所有数据库的账号

Mysql数据库下的user表和db表中存放着可以授予数据库用户的权限,确保只有管理员账号才能访问所有数据库。可以访问mysql数据库的用户或许可以查看密码哈希值、修改用户权限等等。

使用如下sql语句:

SELECT user, host FROM mysql.user

WHERE (Select_priv = 'Y') OR (Insert_priv = 'Y') OR (Update_priv = 'Y')

OR (Delete_priv = 'Y')  OR (Create_priv = 'Y')  OR (Drop_priv = 'Y');

SELECT user, host FROM mysql.db WHERE db = 'mysql'

AND ((Select_priv = 'Y') OR (Insert_priv = 'Y') OR (Update_priv = 'Y')

OR (Delete_priv = 'Y') OR (Create_priv = 'Y') OR (Drop_priv = 'Y'));

确保返回结果只能是数据库管理员账号。

5.2限制非管理员用户的权限

Mysql.user表中的权限列有:

file_priv:表示是否允许用户读取数据库所在主机的本地文件;

Process:表示是否允许用户查询所有用户的命令执行信息;

Super_priv:表示用户是否有设置全局变量、管理员调试等高级别权限;

Shutdown_priv:表示用户是否可以关闭数据库;

Create_user_priv:表示用户是否可以创建或删除其他用户;

Grant_priv:表示用户是否可以修改其他用户的权限;

应确保只有数据库管理员才有上述权限,使用如下sql语句查看拥有各个权限的数据库账号:

select user, host from mysql.user where File_priv = 'Y';

select user, host from mysql.user where Process_priv = 'Y';

select user, host from mysql.user where Process_priv = 'Y';

SELECT user, host FROM mysql.user WHERE Shutdown_priv = 'Y';

SELECT user, host FROM mysql.user WHERE Create_user_priv = 'Y';

SELECT user, host FROM mysql.user WHERE Grant_priv = 'Y';

SELECT user, host FROM mysql.db WHERE Grant_priv = 'Y';

确保查询结果中不存在非管理员用户。

如果存在非管理员用户,使用如下命令进行权限回收:

REVOKE FILE ON *.* FROM 'user';

REVOKE PROCESS ON *.* FROM 'user';

REVOKE SUPER ON *.* FROM 'user';

REVOKE SHUTDOWN ON *.* FROM 'user';

REVOKE CREATE USER ON *.* FROM 'user';

REVOKE GRANT OPTION ON *.* FROM user;

其中user为上述查询到的非管理员用户。

5.3合理控制DML/DDL操作授权

DML/DDL语句包括创建或修改数据库结构的权限,例如insert、update、delete、create、drop和alter语句,在任何数据库中都要控制用户的此类权限,确保只授权给有业务需求的非管理员用户。Mysql命令行下执行如下命令:

SELECT User,Host,Db FROM mysql.db WHERE Select_priv='Y'

OR Insert_priv='Y' OR Update_priv='Y' OR Delete_priv='Y' OR Create_priv='Y'

OR Drop_priv='Y' OR Alter_priv='Y';

上述查询到的用户只能对特地的数据库才有相关的权限,使用如下命令进行相关权限的回收:

REVOKE SELECT ON host.database FROM user;

REVOKE INSERT ON host.database FROM user;

REVOKE UPDATE ON host.database FROM user;

REVOKE DELETE ON host.database FROM user;

REVOKE CREATE ON host.database FROM user;

REVOKE DROP ON host.database FROM user;

REVOKE ALTER ON host.database FROM user;

其中user为查询到的未授权的用户,host为相关主机,database为相关数据库。

6、审计和日志

6.1开启错误日志审计功能

错误日志包括数据库运行和停止过程中的一系列活动信息,有助于分析数据库运行过程中的一些异常活动,一般情况下需要开启错误日志记录功能,使用如下命令查询:

SHOW variables LIKE 'log_error';

确保返回结果为非空,如果为空,需要在mysql数据库配置文件中增加相关配置。

6.2确保日志存放在非系统区域

日志文件随着数据库的运行会不断增加,如果存放在系统区域,则会影响系统的正常运行,使用如下命令进行查询:

SELECT @@global.log_bin_basename;

确保返回结果不是如下路径:/、/var、/usr

6.3关闭原始日志功能

原始日志选项会决定一些敏感信息是否会被明文写进日志中,例如查询日志、慢查询日志、二进制日志,确保数据库配置文件中存在如下配置项:

Log-raw = OFF

7、认证

7.1 Old_passwords环境变量设置

Old_passwords决定了使用PASSWORD()函数和IDENTIFIED BY 、CREATE USER 、GRANT 等语句是时的hash算法:

0 - authenticate with the mysql_native_password plugin

1 - authenticate with the mysql_old_password plugin

2 - authenticate with the sha256_password plugin

设置为mysql_old_password代表弱hash算法,可以快速通过密码字典进行暴力破解。使用如下命令查询相关值:

SHOW VARIABLES WHERE Variable_name = 'old_passwords';

确保返回值不为1。

7.2 secure_auth 选项设置

如果客户端采用Old_passwords发起连接请求,如果服务器端设置了secure_auth,则客户端会拒绝连接请求,可以根据安全需求在配置文件中做相应配置。

7.3 密码保存

确保密码没有明文保存在全局配置文件中。

7.4 确保所有用户都要求使用非空密码登录

执行如下语句查询是否有用户不需要密码即可登录:

SELECT User,host

FROM mysql.user

WHERE (plugin IN('mysql_native_password', 'mysql_old_password')

AND (LENGTH(Password) = 0

OR Password IS NULL))

OR (plugin='sha256_password' AND LENGTH(authentication_string) = 0);

7.5不存在空账号

使用如下命令查询是否存在空账号:

SELECT user,host FROM mysql.user WHERE user = '';

8、网络设置

如果mysql数据库服务器与应用是跨信任域部署的,则需要考虑在数据库服务器与应用服务器之间建立ssl通道进行数据传输,不过这种场景一般很少见,在此不详细描述。

9、数据库备份

如何删除MYSQL日志文件及关闭日志功能

一、关闭MySql日志方法:

找到MySql的配置文件,然后注释以下两行即可(即在行首添加#符号就好了)。然后重启MySql服务

log-bin=mysql-bin

binlog_format=mixed

二、删除日志

1)手动删除日志

手动删除日志的基本语法如下:

PURGE {MASTER | BINARY} LOGS TO'log_name'

PURGE {MASTER | BINARY} LOGSBEFORE 'date'

①、查看当前日志:

show binary logs;

②、查看第一个二进制日志

show binlog events;

③、删除指定日志之前的日志

PURGE MASTER LOGS TO'mysql-bin.010';

④、删除指定日期之前的日志

PURGE MASTER LOGS BEFORE'2018-7-12 13:00:00';

⑤、删除N天前的日志

PURGE MASTER LOGS BEFOREDATE_SUB( NOW( ), INTERVAL N DAY);如下面的语句可以清除 7 天前的binlog,

PURGE MASTER LOGS BEFOREDATE_SUB( NOW( ), INTERVAL 7 DAY);

注意:BEFORE变量的date自变量可以为'YYYY-MM-DDhh:mm:ss'格式。MASTER和BINARY是同义词。

2)自动删除日志

①、第一种方式:设置日志保存时间

修改MySql的配置文件,设置以下属性:expire_logs_days=10。这个值根据实际情况来定。当然对于生产环境修改配置文件需要重启,这个代价可能会很大,还可以通过这个命令来修改生效set global expire_logs_days = 10;

②、第二种方式:设置定时任务

0 3 * * *  `mysql -uroot -e 'PURGE BINARY LOGS BEFOREDATE_SUB( NOW( ), INTERVAL 7 DAY);'`

上面的命令是每天凌晨3点删除7天前的binlog:

mysql preparedstatement关闭后事务回滚还有效么

1、为什么auto_increament没有回滚?

因为innodb的auto_increament的计数器记录的当前值是保存在存内 存中的,并不是存在于磁盘上,当mysql server处于运行的时候,这个计数值只会随着insert改增长,不会随着delete而减少。而当mysql server启动时,当我们需要去查询auto_increment计数值时,mysql便会自动执行:SELECT MAX(id) FROM 表名 FOR UPDATE;语句来获得当前auto_increment列的最大值,然后将这个值放到auto_increment计数器中。所以就算 Rollback MySQL的auto_increament计数器也不会作负运算。

2、MySQL的事务对表操作的时候是否是物理操作?

MySQL的事务是有redo和undo的,redo操作的所有信息都是记录到 redo_log中,也就是说当一个事务做commit操作时,需要先把这个事务的操作写到redo_log中,然后再把这些操作flush到磁盘上,当 出现故障时,只需要读取redo_log,然后再重新flush到磁盘就行了。

而对于undo就比较麻烦,MySQL在处理事务时,会在数据共享 表空间里申请一个段叫做segment段,用保存undo信息,当在处理rollback,不是完完全全的物理undo,而是逻辑undo,就是说会对之 前的操作进行反操作,但是这些共享表空间是不进行回收的。这些表空间的回收需要由mysql的master thread进程来进行回收。

mysql安全加固关闭回滚日志的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于mysql 停止回滚、mysql安全加固关闭回滚日志的信息别忘了在本站进行查找喔。

扫码二维码