Skip to content

MySQL

安装

环境准备

移除mariadb的影响

shell
dnf remove mariadb-libs -y

安装 mysql依赖包

shell
dnf install libaio.x86_64 -y

安装包下载

mysql安装

shell
# 解压
tar -xvf mysql-*
# 安装
rpm -ivh mysql-community-common-8.0.29-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-plugins-8.0.29-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-8.0.29-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-8.0.29-1.el7.x86_64.rpm
rpm -ivh mysql-community-icu-data-files-8.0.29-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-8.0.29-1.el7.x86_64.rpm
# 启动和自启动
systemctl start mysqld
systemctl enable mysqld
# 初始密码,初始化
初始密码在 /var/log/mysqld.log 里面
初始化:mysql_secure_installation
# 创建用户
CREATE USER 'user_name'@'%' IDENTIFIED BY 'password';
# 给用户授权
GRANT ALL PRIVILEGES ON database_name.* TO 'user_name'@'%'  WITH GRANT OPTION;
# 创建并授权用户
GRANT ALL PRIVILEGES ON database_name.* TO 'user_name'@'%' IDENTIFIED BY 'user_password' WITH GRANT OPTION;
# 刷新权限
FLUSH PRIVILEGES;

自定义配置

shell
# vim /etc/my.cnf
[mysqld]
port = 13307 # 自定义端口
character-set-server = utf8mb4 # 设置 MySQL 服务器的默认字符集
collation-server = utf8mb4_unicode_ci # 设置 MySQL 服务器的默认排序规则

[client]
default-character-set=utf8mb4 # 设置 MySQL 客户端的默认字符集

[mysql]
default-character-set=utf8mb4 # 设置 mysql 命令行客户端的默认字符集

防火墙

shell
# 检查防火墙是否包含 3306端口
firewall-cmd --list-ports
# 防火墙开放3306
firewall-cmd --permanent --zone=public --add-port=3306/tcp
# reload防火墙
firewall-cmd --reload

编译安装

shell
# 安装依赖
yum install gcc gcc‐c++ make cmake ncurses‐devel  autoconf
# 新建MySQL用户
groupadd mysql
useradd ‐r ‐g mysql ‐s /bin/false mysql
# 安装
tar ‐xf mysql‐5.6.26.tar.gz
cd mysql‐5.6.26
cmake . ‐DENABLED_LOCAL_INFILE=1 ‐DCMAKE_INSTALL_PREFIX=/usr/local/mysql && make && make install
# 目录规划
数据目录:$lvm分区/$项目名称/data
日志目录:$lvm分区/$项目名称/log
tmp目录:$lvm分区/$项目名称/tmp

运维

常用命令

  • 查询是否锁表: show OPEN TABLES where In_use > 0;
  • 查询进程:show processlist
  • kill 进程: kill id
  • 查看进行中的事务: SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
  • 查看正在锁的事务: SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
  • 查看等待锁的事务: SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
  • 当前运行的所有事务: information_schema.innodb_trx
  • 当前出现的锁: information_schema.innodb_locks
  • 锁等待的对应关系: information_schema.innodb_lock_waits

慢查询记录

shell
[mysqld]
slow_query_log = ON
slow_query_log_file = /var/lib/mysql/test-slow.log
long_query_time = 1
# 测试
select sleep(2);

配置

修改密码

shell
ALTER USER `root`@`%` IDENTIFIED BY 'new_password';
FLUSH PRIVILEGES;

强制修改密码

shell
# vim /etc/my.cnf
[mysqld]
skip-grant-tables

# 登录并修改密码
# MySQL 5.6 及以下
UPDATE user SET Password = password ( ‘new-password’ ) WHERE User = ‘root’ ;

# MySQL:5.7
UPDATE mysql.user set authentication_string=password('123qwe') where user='root' and Host = 'localhost';

flush privileges;

only_full_group_by

建议更严格的模式

shell
[mysqld]
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

安装 Mariadb

shell
yum install mariadb-server -y
systemctl enable/start/stop/restart mariadb
mysql_secure_installation # 初始化

大小写敏感

shell
[mysqld]
lower_case_table_names=1 # 【1不敏感,0敏感】

导入导出

导出

shell
# 按 schema 维度导出
mysqldump -P 3306 -uroot -p [schema_name] > /path/to/backup_date.sql
zip -r /path/to/backup_date.zip /path/to/backup_date.sql

# 导入
mysql -P 3306 -uroot -p [schema_name] < /path/to/backup_date.sql

导入

使用

生成随机数

sql 生成

sql
SELECT
	(@i :=@i + 1) i,
	table_name.*
FROM
    table_name,
	(SELECT @i := 0) AS it

存储过程生成

sql
CREATE DEFINER= CURRENT_USER FUNCTION `rand_string`(n INT) RETURNS varchar(255) CHARSET utf8
    COMMENT '获取随机数'
BEGIN

    DECLARE chars_str varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    DECLARE return_str varchar(255) DEFAULT '';
    DECLARE i INT DEFAULT 0;
    WHILE i < n DO
        SET return_str = concat(return_str,substring(chars_str , FLOOR(1 + RAND()*62 ),1));
        SET i = i +1;
    END WHILE;
    RETURN return_str;
END

生成时间 序列

sql
WITH recursive time_sequence(year_time) AS (
    SELECT CAST('2020-01-01 00:00:00' as datetime)
    UNION ALL
    SELECT year_time + INTERVAL 1 YEAR FROM time_sequence WHERE year_time < NOW()
)
SELECT * FROM sequence;

Released under the MIT License.