分类 默认分类 下的文章

删除 MySQL 的二进制日志文件(mysql-bin)是一个需要谨慎操作的过程,因为这些日志文件用于记录数据库的所有更改操作,对于数据恢复、主从复制等非常重要。如果你确实需要删除或清理这些日志文件,以下是几种安全的方法:

方法一:使用 PURGE BINARY LOGS 命令

这是最推荐的方法,因为它可以在不影响当前正在使用的日志文件的情况下,安全地删除旧的日志文件。

  1. 登录 MySQL

    mysql -u root -p
  2. 查看当前的二进制日志文件

    SHOW BINARY LOGS;
  3. 删除指定日期之前的日志文件

    PURGE BINARY LOGS TO 'mysql-bin.0000XX';

    或者

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

例如,删除 2023 年 1 月 1 日之前的所有日志文件:

PURGE BINARY LOGS BEFORE '2023-01-01 00:00:00';
  1. 确认删除结果
    再次运行 SHOW BINARY LOGS; 查看是否已成功删除。

方法二:修改 MySQL 配置文件

如果希望定期自动清理二进制日志文件,可以在 MySQL 配置文件中设置保留时间。

  1. 编辑 MySQL 配置文件(通常是 /etc/my.cnf/etc/mysql/my.cnf):

    [mysqld]
    expire_logs_days = 7

    这将设置二进制日志文件保留 7 天后自动删除。

  2. 重启 MySQL 服务

    sudo systemctl restart mysqld

方法三:手动删除(不推荐)

虽然可以直接手动删除二进制日志文件,但这可能会导致主从复制等问题,因此不推荐这样做。如果你仍然选择手动删除,请确保先停止 MySQL 服务,并且备份所有重要的日志文件。

  1. 停止 MySQL 服务

    sudo systemctl stop mysqld
  2. 删除日志文件

    rm /var/lib/mysql/mysql-bin.*
  3. 重置二进制日志文件
    编辑 MySQL 数据目录下的 index 文件(通常为 mysql-bin.index),删除其中的内容。
  4. 启动 MySQL 服务

    sudo systemctl start mysqld

注意事项

  • 备份重要数据:在进行任何操作之前,确保已经备份了所有重要的数据和日志文件。
  • 检查主从复制状态:如果你的 MySQL 是主从架构的一部分,确保删除不会影响从库的同步。
  • 监控系统性能:删除大量日志文件可能会对系统性能产生短期影响,建议在低峰期进行操作。

通过以上方法,你可以安全地管理和清理 MySQL 的二进制日志文件。推荐使用 PURGE BINARY LOGS 命令,因为它是最安全和可靠的方式。

表250万行,可能是磁盘空间不够(存放数据的盘只有5G空闲空间)的情况下出现失败:

ALTER TABLE pre_answers_caiji9 ENGINE=InnoDB
1114 - The table '#sql-6b33_1d98828' is full

分步操作,新建表再复制数据的方式进行:

CREATE TABLE pre_answers_caiji9_new LIKE pre_answers_caiji9;
ALTER TABLE pre_answers_caiji9_new ENGINE=InnoDB;

INSERT INTO pre_answers_caiji9_new SELECT * FROM pre_answers_caiji9 WHERE id BETWEEN 1 AND 1000000;
INSERT INTO pre_answers_caiji9_new SELECT * FROM pre_answers_caiji9 WHERE id BETWEEN 1000001 AND 2000000;
-- 继续插入剩余的数据, 一次1百万行太久,可降低到10万...

-- 重命名表
RENAME TABLE pre_answers_caiji9 TO pre_answers_caiji9_old, pre_answers_caiji9_new TO pre_answers_caiji9;

--删除旧表
DROP TABLE pre_answers_caiji9_old;


        //复制图片功能
        $(document).on('click', ".j-copy-image", function(e) {
            var img = $('#' + $(this).data('target'))[0]
            var canvas = document.createElement('canvas')
            canvas.width = img.naturalWidth
            canvas.height = img.naturalHeight
            var ctx = canvas.getContext('2d');
            ctx.drawImage(img, 0, 0)
            canvas.toBlob(async blob => {
                const data = [
                    new ClipboardItem({
                        [blob.type]: blob,
                    }),
                ];
                await navigator.clipboard.write(data)
                    .then(
                        () => {
                            simpleDialog({
                                msg: '复制成功'
                            })
                        },
                        () => {
                            simpleDialog({
                                msg: '复制失败,请右键选择【复制图像】'
                            })
                        }
                    );
            });
        })

ls -l 显示年份
默认情况下ls -l命令只显示月和日,不显示年份:

$ ls -l
lrwxrwxrwx 1 root root 7 Feb 27 16:12 bin -> usr/bin

如要要显示年份,就要使用--time-style参数,该参数有几个选项

  • full-iso 精确显示年月日时分秒纳秒及时区
  • long-iso 显示年月日时分
  • iso 默认就是iso,显示月日时分
  • locale 按当前系统环境区域设置显示

+Format 自定义格式显示

所以要显示年份可以使用full-iso、long-iso、+Format这几种参数选项。

$ ls -l --time-style=full-iso
lrwxrwxrwx 1 root root 7 2016-02-27 16:12:03.185940151 +0800 bin -> usr/bin
$ ls -l --time-style=long-iso
lrwxrwxrwx 1 root root 7 2016-02-27 16:12 bin -> usr/bin
$ s -l --time-style="+%Y-%m-%d %H:%I:%S" 
lrwxrwxrwx 1 root root 7 2016-02-27 16:04:03 bin -> usr/bin

--time-style=full-iso有一个替代参数--full-time,可以直接用这个参数来显示精确的时间:

$ ls --full-time
lrwxrwxrwx 1 root root 7 2016-02-27 16:12:03.185940151 +0800 bin -> usr/bin