mysql环境设置

1. 安装设置mysql

1.1. 安装mysql

yum -y install yum-utils
rpm -ivh https://repo.mysql.com//mysql57-community-release-el7-9.noarch.rpm
rpm -ivh https://repo.mysql.com/yum/mysql-8.0-community/sles/12/x86_64/mysql-community-server-8.0.4-0.1.rc.sles12.x86_64.rpm

yum-config-manager --disable mysql57-community
yum-config-manager --enable mysql80-community

yum install mysql-community-server -y

systemctl start mysqld
systemctl enable mysqld

1.2. 找登录密码

grep "password" /var/log/mysqld.log

1.3. 登录

mysql -uroot -p

1.4. 设置密码安全策略

mysql 5.5+
在mysql控制台下
set global validate_password_policy=0;
当次生效

或者
在/etc/my.cnf文件添加validate_password_policy配置,指定密码策略

选择0(LOW),1(MEDIUM),2(STRONG)其中一种,选择2需要提供密码字典文件
validate_password_policy=0

如果不需要密码策略,添加my.cnf文件中添加如下配置禁用即可:

validate_password = off

mysql 8.0+
set global validate_password.policy=0;
set global validate_password.length=1;  

1.5. 设置密码

在mysql控制台下
set password = password('new_password');

1.6. 创建新账号增加权限

grant all privileges on *.* to 'username'@'%' identified by 'password' with grant option;
FLUSH PRIVILEGES;

grant all privileges on gogs.* to 'git'@'%' identified by 'password' with grant option;
FLUSH PRIVILEGES;

2. 命令行执行SQL

mysql -h127.0.0.1 -uusername -ppassword -e "create database zabbix character set utf8 collate utf8_bin;"
mysql -h127.0.0.1 -uusername -ppassword -e "grant all privileges on *.* to 'username'@'%' identified by 'password' with grant option;"

mysql -h127.0.0.1 -uusername -ppassword < server/createdb.sql

3. 密码恢复

3.1. 停止mysqld;

(1). /etc/init.d/mysql stop
(2). killall -TERM mysqld
(您可能有其它的方法,总之停止mysqld的运行就可以了)

3.2. 用以下命令启动MySQL,以不检查权限的方式启动;

mysqld --skip-grant-tables &

3.3. 然后用空密码方式使用root用户登录 MySQL

mysql -u root

3.4. 修改root用户的密码

mysql> update mysql.user set password=PASSWORD('newpassword') where User='root'; 
mysql> flush privileges;
mysql> quit
重新启动MySQL

/etc/init.d/mysql restart
就可以使用新密码 newpassword 登录了。

4. xpath

SELECT id, FROM_UNIXTIME(CAST(EXTRACTVALUE ( DATA, '/coder/datas/GuildWorldBoss/Start' )/1000 AS UNSIGNED ), '%Y-%c-%d %H:%i:%s' ) AS StartTime FROM guildwb

5. mysql执行log开启

5.1. 查看状态

SHOW VARIABLES LIKE’general_log%’;

5.2. 开启

SET GLOBAL general_log =’ON’;

5.3. 关闭

SET GLOBAL general_log =’OFF’;

6. 配置

mysql 5.7以上版本默认开启ssl关闭方式如下 vim /etc/my.cnf 增加 skip_ssl

7. mysql数据库注意点

7.1. on duplicate key update 死锁问题

如果遇到这个问题怎么办呢?我们有下面的一些方法来解决这个问题:

使用mysql5.6版本,可以看见这个是在5.7中引入的,5.6中不会出现这个情况

使用RC级别,RC隔离级别下不会有gap锁
-- 不要使用 insert on duplicate key update,使用普通的insert。我们最后使用的就是这个方法,因为ON DUPLICATE KEY UPDATE 这个在代码中的确是没有必要

在数据库表中只建立主键,不建立其他唯一索引。

先insert 再捕获异常,然后进行更新

使用insert ignore,然后判断update rows 是否是1,然后再决定是否更新。

8. mysqlserver8.0问题点

mysql server errorlog忽然爆出大量的sha256_password’ is deprecated and will be removed in a future release.

select user,host,plugin from mysql.user; INSTALL PLUGIN CONNECTION_CONTROL SONAME ‘connection_control.so’; INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS SONAME ‘connection_control.so’; select * from information_schema.connection_control_failed_login_attempts;

经过排查和确认,某程序的加密方式与MySQL 8.0 caching_sha2_password 不兼容导致的,可以通过使用 mysql_native_password 创建用户尝试避开不兼容的问题

9. mysqlserver innodb_autoinc_lock_mode用途

AUTO_INCREMENT Handling in InnoDB InnoDB提供了一个可配置的锁定机制,可以显着提高使用AUTO_INCREMENT列向表中添加行的SQL语句的可伸缩性和性能。 要对InnoDB表使用AUTO_INCREMENT机制,必须将AUTO_INCREMENT列定义为索引的一部分,以便可以对表执行相当于索引的SELECT MAX(ai_col)查找以获取最大列值。 通常,这是通过使列成为某些表索引的第一列来实现的。

本节介绍AUTO_INCREMENT锁定模式的行为,对不同AUTO_INCREMENT锁定模式设置的使用含义,以及InnoDB如何初始化AUTO_INCREMENT计数器。

InnoDB AUTO_INCREMENT锁定模式

InnoDB AUTO_INCREMENT锁定模式使用含义

InnoDB AUTO_INCREMENT计数器初始化

SELECT @@innodb_autoinc_lock_mode;

9.1. innodb_autoinc_lock_mode 的说明

  innodb_auto_lockmode有三个取值:     1、0 这个表示tradition 传统     2、1 这个表示consecutive 连续     3、2 这个表示interleaved 交错

9.2. tradition(innodb_autoinc_lock_mode=0) 模式:

  1、它提供了一个向后兼容的能力   2、在这一模式下,所有的insert语句(“insert like”) 都要在语句开始的时候得到一个     表级的auto_inc锁,在语句结束的时候才释放这把锁,注意呀,这里说的是语句级而不是事务级的,    一个事务可能包涵有一个或多个语句。   3、它能保证值分配的可预见性,与连续性,可重复性,这个也就保证了insert语句在复制到slave 的时候还能生成和master那边一样的值(它保证了基于语句复制的安全)。 4、由于在这种模式下auto_inc锁一直要保持到语句的结束,所以这个就影响到了并发的插入。

9.3. consecutive(innodb_autoinc_lock_mode=1) 模式:

  1、这一模式下去simple insert 做了优化,由于simple insert一次性插入值的个数可以立马得到 确定,所以mysql可以一次生成几个连续的值,用于这个insert语句;总的来说这个对复制也是安全的 (它保证了基于语句复制的安全)   2、这一模式也是mysql的默认模式,这个模式的好处是auto_inc锁不要一直保持到语句的结束,只要 语句得到了相应的值后就可以提前释放锁

9.4. interleaved(innodb_autoinc_lock_mode=2) 模式

  1、由于这个模式下已经没有了auto_inc锁,所以这个模式下的性能是最好的;但是它也有一个问题,就是 对于同一个语句来说它所得到的auto_incremant值可能不是连续的。