Skip to main content
Nordlys logo, a drawing of two gray mountains with green northern lights in the background 陈迪の自留地

Back to all posts

数据库相关操作记录

Published on by Chen Di · 6 min read

本文内容部分生成自 ChatGPT

导出表结构

mysqldump -u 用户名 -p --no-data test > test_structure.sql

导入表结构

mysql -u 用户名 -p 数据库名 < test_structure.sql

新建数据库并指定字符集

CREATE DATABASE cash_loan_base 
CHARACTER SET utf8mb4 
COLLATE utf8mb4_general_ci;

# CHARACTER SET utf8mb4:指定数据库使用 utf8mb4 字符集,可以支持更多字符(如表情符号)。
# COLLATE utf8mb4_general_ci:设置排序规则为不区分大小写的 utf8mb4_general_ci,方便中文或多语言应用中排序与查询的兼容性。

为新用户赋予权限

-- 创建用户 risk_user,并设置密码
CREATE USER 'risk_user'@'localhost' IDENTIFIED BY 'your_password';

-- 赋予增删改查权限
GRANT SELECT, INSERT, UPDATE, DELETE ON your_database.* TO 'risk_user'@'localhost';

-- 刷新权限
FLUSH PRIVILEGES;

函数相关

-- 列出函数
SHOW FUNCTION STATUS WHERE Db = 'database_name';

-- 查看函数创建命令
SHOW CREATE FUNCTION function_name;

-- 导入函数
DELIMITER //
CREATE DEFINER=`root`@`%` FUNCTION `_nextval`(`seq_name_p` varchar(50))  RETURNS bigint(20) READS SQL DATA BEGIN DECLARE _cur INT;   DECLARE _maxvalue BIGINT(20); DECLARE _increment INT; SET _increment = (SELECT increment_val FROM sys_sequence WHERE seq_name = seq_name_p); SET _maxvalue = (SELECT max_val FROM sys_sequence WHERE seq_name = seq_name_p); SET _cur = (SELECT current_val FROM sys_sequence WHERE seq_name = seq_name_p); UPDATE sys_sequence SET current_val = _cur + _increment WHERE seq_name = seq_name_p; IF (_cur + _increment >= _maxvalue) THEN UPDATE sys_sequence SET current_val = min_val WHERE seq_name = seq_name_p; END IF; RETURN _cur;

END //

DELIMITER ;

最大连接数

SHOW VARIABLES LIKE 'max_connections';
SET GLOBAL max_connections = 800;

另一种情况,命令行模式登录 MySQL 提示 too many connections

# 在 my.conf 新增最大连接数配置

vim /etc/my.cnf

[mysqld]
...
max_connections=1000000

sql_mode 相关

在 MySQL 中,ONLY_FULL_GROUP_BY 是一种 SQL 模式,它要求 GROUP BY 查询中的列必须是聚合函数的一部分,或者明确出现在 GROUP BY 子句中。如果你希望关闭这个模式,可以按以下步骤操作:

方法 1:临时关闭(会话级别)

这种方法仅在当前会话有效,适用于短期需求。

  1. 登录 MySQL

    mysql -u root -p
  2. 检查当前 SQL 模式: 执行以下命令,查看当前启用的 SQL 模式:

    SELECT @@sql_mode;
  3. 移除 ONLY_FULL_GROUP_BY: 将 ONLY_FULL_GROUP_BY 从当前会话的 SQL 模式中移除:

    SET sql_mode = REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', '');
  4. 验证设置是否生效: 重新检查 SQL 模式,确认 ONLY_FULL_GROUP_BY 已被移除:

    SELECT @@sql_mode;

方法 2:永久关闭(全局级别)

这种方法适用于需要长期关闭 ONLY_FULL_GROUP_BY 的场景。

  1. 编辑 MySQL 配置文件: 打开 MySQL 配置文件(通常位于 /etc/mysql/my.cnf/etc/my.cnf)。

  2. 修改 sql_mode 配置: 在 [mysqld] 部分中,添加或修改 sql_mode,确保移除 ONLY_FULL_GROUP_BY

    [mysqld]
    sql_mode="STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

    这里列出的模式是一个常见的默认设置,移除了 ONLY_FULL_GROUP_BY

  3. 重启 MySQL 服务: 保存配置文件后,重启 MySQL 服务以应用更改:

    sudo systemctl restart mysql
  4. 验证设置: 登录 MySQL,检查全局 SQL 模式:

    SELECT @@GLOBAL.sql_mode;

方法 3:直接修改全局模式(运行时修改)

  1. 移除 ONLY_FULL_GROUP_BY: 在 MySQL 中运行以下命令,修改全局 SQL 模式:

    SET GLOBAL sql_mode = REPLACE(@@GLOBAL.sql_mode, 'ONLY_FULL_GROUP_BY', '');
  2. 验证设置: 检查是否成功移除:

    SELECT @@GLOBAL.sql_mode;
  3. 注意事项

    • 此方法在 MySQL 服务重启后会失效。要永久生效,仍需修改配置文件。

binlog 日志清理

master-bin.000015 是 MySQL 的二进制日志文件(Binary Log file),它记录了数据库中所有修改数据的事件(如 INSERTUPDATEDELETE),以及某些DDL语句(如 CREATE TABLE),以供以下用途:

  1. 数据恢复:通过重放二进制日志,恢复因错误或意外删除导致的数据丢失。
  2. 主从复制:二进制日志是主从复制中主服务器向从服务器传递数据变更的关键部分。

1. 查看当前日志文件列表

通过以下命令查看当前的二进制日志文件:

SHOW BINARY LOGS;

或者查看当前在用的日志文件:

SHOW MASTER STATUS;

2. 删除旧的二进制日志

MySQL 提供了清理日志的内置命令:

  • 清除指定日期之前的日志

    PURGE BINARY LOGS BEFORE 'YYYY-MM-DD HH:MM:SS';

    例如:

    PURGE BINARY LOGS BEFORE '2024-01-01 00:00:00';

    这会删除指定日期之前的所有二进制日志。

  • 清除指定日志文件之前的日志

    PURGE BINARY LOGS TO 'master-bin.000015';

    这会删除 master-bin.000015 之前的所有日志文件。


3. 自动清理二进制日志(可选)

为了避免手动清理,可以在 my.cnf(或 my.ini)中配置自动删除过期日志:

[mysqld]
expire_logs_days = 7  # 自动保留最近7天的二进制日志

然后重启 MySQL 服务使其生效。


4. 确认操作的安全性

  • 确保备份:清理之前,确认不再需要这些日志用于恢复或主从复制。
  • 检查主从复制状态:如果正在使用主从复制,确认从服务器已经完全同步旧日志,以免导致数据不一致。

通过以上方法,您可以安全高效地清理 master-bin.000015 及其他旧的二进制日志文件。