mysql

mysql #

install on ubuntu #

bash
sudo apt install software-properties-common
sudo add-apt-repository "deb http://repo.mysql.com/apt/ubuntu/ bionic mysql-5.7"
#sudo add-apt-repository "deb http://repo.mysql.com/apt/ubuntu bionic mysql-8.0"
sudo apt update
sudo apt install mysql-server-5.7
#sudo apt install mysql-server-8.0

service #

bash
sudo systemctl start mysql.service
sudo systemctl stop mysql.service
sudo systemctl restart mysql.service

run in docker #

docker-compose.yml:

yml
version: "3.7"
volumes:
  mysql57:
    name: mysql57
network:
  mysql57:
    name: mysql57
    external: true
services:
  mysql:
    image: mysql:5.7
    container_name: mysql57
    #image: mysql:8.0
    command: |
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --max-allowed-packet=104800000
      --sql-mode=STRICT_TRANS_TABLES
    restart: on-failure
    volumes:
      - mysql57:/var/lib/mysql
      - /etc/localtime:/etc/localtime:ro
    ports:
      - 3306:3306
    environment:
      - TZ=Asia/Shanghai
      - MYSQL_ROOT_PASSWORD=123456
    networks:
      - mysql57

安装完成后事项 #

主要针对安装在主机上的mysql。

配置 #

/etc/mysql/mysql.conf.d/mysqld.cnf:

text
#bind-address=127.0.0.1
character_set_server=utf8mb4

初始化root用户密码 #

bash
sudo systemctl stop mysql.service
# 进入安全安装向导
sudo mysql_secure_installation
sudo systemctl start mysql.service

更换密码 #

bash
# 1. 登录
$ mysql -u username -p
# 2. 执行语句
ALTER USER 'username'@'%' IDENTIFIED BY 'new_password';
FLUSH PRIVILEGES;
EXIT;

常用SQL语句 #

创建用户、数据库、授权 #

sql
-- 创建用户
CREATE USER IF NOT EXISTS 'newuser'@'%' IDENTIFIED BY 'password';
-- (mysql 8.0) 当默认密码插件不是 mysql_native_password 时,使用以下语句:
CREATE USER IF NOT EXISTS 'newuser'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

-- 删除数据库
DROP DATABASE IF EXISTS `database_name`;
-- 创建数据库
CREATE DATABASE IF NOT EXISTS `new_database` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- ----全局权限
-- ----已知全局权限有:SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER
-- 授予全局权限:
GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'%';
-- GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'%' WITH GRANT OPTION;
-- 授予全局授权权限:
GRANT GRANT OPTION ON *.* TO 'newuser'@'%';

-- ----数据库权限
-- ----已知数据库权限有:SELECT, INSERT, UPDATE, REFERENCES, DELETE, CREATE, DROP, ALTER, INDEX, TRIGGER, CREATE VIEW, SHOW VIEW, EXECUTE, ALTER ROUTINE, CREATE ROUTINE, CREATE TEMPORARY TABLES, LOCK TABLES, EVENT
-- 授予数据库权限:
GRANT ALL PRIVILEGES ON `new_database`.* TO 'newuser'@'%';
-- 授予数据库授权权限:
GRANT GRANT OPTION ON `new_database`.* TO 'newuser'@'%';

FLUSH PRIVILEGES;

用户与权限管理 #

sql
-- 授予查询和插入权限(该用户可将这些权限授予其他用户):
GRANT SELECT, INSERT ON `database`.`table` TO 'username'@'hostname' WITH GRANT OPTION;
-- 回收查询和插入权限(包括被传播的用户):
REVOKE SELECT, INSERT ON `database`.`table` FROM 'username'@'hostname' CASCADE;

-- 删除用户:
DROP USER 'username'@'hostname', ['username'@'hostname'];
-- 删除用户:
DELETE FROM mysql.user WHERE Host='hostname' AND User='username';
-- 查询用户:
SELECT Host, User FROM mysql.user;

允许外网访问 #

创建可被外网访问的root用户:

sql
-- 1)创建用户:
CREATE USER 'root'@'%' IDENTIFIED BY 'password';
-- 2)修改现有root用户限制:
-- ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;
-- 3)授予权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
-- 4)刷新权限:
FLUSH PRIVILEGES;
-- 5)修改 my.cnf 或 my.ini 配置文件然后重启服务:bind-address = 0.0.0.0
-- 6)修改防火墙设置。

性能诊断、优化 #

sql
-- 查看状态(输出服务器版本号、运行时间、线程数、慢查询数、秒均查询数等)
STATUS;

-- 查看当前正在执行的sql语句:
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST;
-- 或者:
SHOW PROCESSLIST;

-- 分析查询语句(执行计划)
DESCRIBE SELECT ...;

-- 查看建表语句:
SHOW CREATE TABLE table_name;
-- 列出表字段:
SHOW COLUMNS FROM table_name;
-- 或者:
DESCRIBE table_name;

-- 添加索引:
ALTER TABLE table_name ADD INDEX index_name (column_list);
ALTER TABLE table_name ADD INDEX index_name (column_list(index_length));
ALTER TABLE table_name ADD UNIQUE INDEX index_name (column_list);
ALTER TABLE table_name ADD FULLTEXT INDEX index_name (column_list);
ALTER TABLE table_name ADD PRIMARY KEY (column_list);
-- 或者:
CREATE INDEX index_name ON table_name (column_list); -- 除了主键索引,其他索引跟上面类似

-- 删除索引:
ALTER TABLE table_name DROP INDEX index_name; -- 除了主键索引,其他索引都用这种方式删除
ALTER TABLE table_name DROP PRIMARY KEY;
-- 或者:
DROP INDEX index_name ON table_name;

导入/导出sql文件 #

导入sql #

bash
# 方案A
$ mysql --default-character-set=utf8mb4 -uUSERNAME -pPASSWORD DB_NAME < FILE_PATH

# 方案B
# 1. 进入控制台
$ mysql --default-character-set=utf8mb4 -uUSERNAME -pPASSWORD
# 2. 选择数据库
use DB_NAME;
# 3. 执行sql文件
source FILE_PATH;

导出sql #

bash
# 导出所有数据到sql文件
$ mysqldump -uroot -pPASSWORD --all-databases > FILE_PATH

# 导出指定数据库/表到sql文件
$ mysqldump -uroot -pPASSWORD --databases DB1 DB2 DB3 > FILE_PATH
$ mysqldump -uroot -pPASSWORD DB_NAME > FILE_PATH
$ mysqldump -uroot -pPASSWORD DB_NAME TABLE_NAME > FILE_PATH

注意事项 #

密码相关:

bash
# 若密码中有特殊字符,则可以用引号将密码包起来(防止被识别为bash特殊字符):
mysql -uUSERNAME -p"123456'()[]{}?!@#%^&"
mysql -uUSERNAME -p'123456"$\'

# 若不想在命令行中暴露密码,则可以使用以下方式(交互式输入密码后才会继续执行):
mysql -uUSERNAME -p
mysql -uUSERNAME -p -- DB_NAME

Docker相关:

bash
# 进入控制台(需要分配虚拟tty)
docker exec -it CONTAINER_NAME mysql ...
docker compose exec SERVICE_NAME mysql ...

# 导入sql(不可以分配虚拟tty)
docker exec -i CONTAINER_NAME mysql ... < FILE_PATH
docker compose exec -T SERVICE_NAME mysql ... < FILE_PATH

# 导出sql(不可以分配虚拟tty)
docker exec -i CONTAINER_NAME mysqldump ... > FILE_PATH
docker compose exec -T SERVICE_NAME mysqldump ... > FILE_PATH
2025年6月13日