MySQL 中关于 Binlog 保留时间的变量
我刚刚踩了一个坑,就是 MySQL 数据库的大小远远超过了期望中的大小,导致了一些问题。排查后发现是 binlog 占用空间过高所致。所以在不关闭 binlog 的情况下,就需要修改 binlog 的保留时间。
MySQL 中以往都是使用变量 expire_logs_days 来控制 binlog 保留时间的,单位是天。
在 8.0 以后的版本中,又新增了变量 binlog_expire_logs_seconds 来更精确的以秒为单位的控制 binlog 保留时间。
我们可以看一下:
12345678910111213141516mysql> select version();+-----------+| version() |+-----------+| 8.0.26 |+-----------+1 row in set (0.00 sec)mysql> show variables like "%expire_logs%";+----------------------------+---------+| Variable_name ...
C++ 最麻烦的解释(C++'s most vexing parse)
1. 什么是 C++ 最麻烦的解释?C++ 最麻烦的解释(C++’s most vexing parse)是半开玩笑的说法,由 Scott Meyers 在《Effective STL》中提出,含义是:
针对存在二义性的 C++ 语句,只要它有可能被解释成函数声明,编译器就肯定将其解释成函数声明。
C++ 正式标准中明确了这一法则。详见标准文件 ISO/IEC 14882:2011 的 8.2 节。
2. 二义性的例子我们先看一个代码:
1234567891011class background_task{public: void operator()() const { do_something(); do_something_else(); }}background_task f;std::thread my_thread(f);
上面的代码中,我们设计了一个重载了 () 的类,并实例化了对象 f,然后将其传给 std::thread 对象的构造函数中。
与 C++ 标准库中许多类型相同,任 ...
Linux 挂载磁盘的相关操作
1. 常用操作简介先给出最常用的挂载步骤和相关命令:
fdisk -l :显示全部的磁盘分区信息。
lsblk -f:列出所有可用块设备的信息,包括文件系统类型,而且还能显示他们之间的依赖关系,但是不会列出 RAM 的信息。我比较喜欢和 df -Th 搭配用。后面我都会说。
df -Th:显示文件系统的类型、使用情况、挂载位置等信息(T 显示文件系统类型,h 表示把大小转成易读的单位)。
mkfs:格式化磁盘。
mount:挂载磁盘。
最后我们还应该进行配置,使得即便机器重启后可以自动挂载,这很有必要,否则可能会丢失数据!
然后根据我本机的情况,下面给出一个流程示例。
2. 一个示例我这里的系统是 ubuntu 22.04,是阿里云的一个 ECS。
不过这些都不重要,各个系统的操作都是差不多的,下面开始。
2.1. 显示全部的磁盘分区信息首先我们执行一下 fdisk -l 命令:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 ...
Linux 中 nohup 命令的用法
1. nohup 命令的作用和语法Linux 中的每个命令都会在其执行时开始一个进程,并且此进程会在终端退出时自动终止。假设你正在通过 SSH 执行程序,如果连接断开,会话会被终止,所有正在执行的进程都会终止,然后你可能会面临一个巨大的意外风险。在这个例子中,在后台运行命令对用户来说就有用了,这便是 nohup 命令的使用场景。nohup (No Hang Up,即不悬挂) 是 Linux 系统命令,用于运行进程,即便用户已经从 shell 或终端登出了也不会终止。
通常,Linux 系统中的每个进程都会在关闭/退出终端后,收到一个 SIGHUP(挂起信号),这个信号代表终止该进程。nohup 命令会在关闭/退出 shell 或终端时组织进程收到此信号。如果一个任务如果使用 nohup 命令开始或执行,那么对用户来说标准输入 stdin 将不可用,标准输出 stdout 和标准错误 stderr 将默认输出到 nohup.out 文件(在执行命令的目录生成)中。也可以把 nohup 命令的输出重定向到其他文件,这样的话 nohuo.out 文件就不会有了。
nohup 命令语法:
1n ...
Linux C/C++ 实现终端进度条
在终端打印进度条原理很简单,有以下几点要清楚:
\r 的作用是将光标移回行首。
\n 的作用是换行(通常会 flush 缓冲的行)。
我们可以用 \r 将光标移回行首,重新打印一样格式的内容,覆盖旧的内容,由于机器运行速度非常快,看起来就像原地修改一样。
下面是我自己实现的一个简单的进度条类,不过只是实现功能,不保证 bug free。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758#include <cstdio>#include <ios>#include <iostream>#include <string>#include <sys/types.h>#include <unistd.h>class ProgressBar {public: ProgressBar(const char finish = '# ...
在 Linux 终端输出带颜色文字的方法
我们经常会看到一些程序在 Linux 终端的输出是带有颜色的。
除了默认颜色外,最常见的应该是红色、黄色和绿色,分别代表错误(Error)/失败(Failed)、警告(Warning)和成功(Successed)。当然可以输出的不止这三个颜色,只是这三个最常用。
本文以这三个颜色为例,说明在 Linux 终端输出带颜色文字的方法。
首先说明,在终端中给文字加颜色和使用的编程语言没有关系,不论是 shell,还是 C/C++、Java、Python 或是 Go 语言的控制台输出,等等,都是一样的。带颜色的文字,其实只是普通文字加了转义字符罢了,没有什么特殊之处。
此外,在终端中,除了可以给文字加颜色,也可以给文字加背景色,背景色在某些场景下也十分有用,这个在后面也会说。
1. 示例演示下面先看一个例子,使用 C++ 语言输出:
123456789#include <iostream>int main(int argc, char* argv[]) { std::cout << "C/C++ 在 Linux 终端输出 \e[31m红色\e[ ...
C++11 中 lambda 的使用方法
lambda 是 C++11 中的特性,可以简化我们的代码,非常好用。
lambda 的基本功能最常用,且简单。
但其实 lambda 也有很多花里胡哨的功能,这篇文章主要讲基本功能,参考资料来自 Lambda expressions (since C++11) - cppreference.com,如果你想要学习那些本文中没有介绍的花里胡哨的用法,可以自己看看。
1. 一个简单的示例演示这里先通过一个很简单的示例来看看 lambda 的使用场景。
我们知道 C++ 中的 sort() 函数可以对数组进行排序,如果你排序的是一个 int 类型的数组,那 sort() 的默认行为是从小到大排序,而 sort 的第三个参数可以自定义比较函数,我们这里使用 lambda 让其从大到小排序 int 数组。
12// exec sort() using our own compare function (lambda)sort(vec.begin(), vec.end(), [](int a, int b){ return a > b; });
我们写一个简单地完成程序 ...
使用 mmap 函数的用户级内存映射
本文参考:《深入理解计算机系统》第 9.8.4 小节。
1. mmapLinux 进程可以使用 mmap 函数来创建新的虚拟内存区域,并将对象映射到这些区域中。
12345678#include <unistd.h>#include <sys/mman.h>void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);// 返回:若成功时则为指向映射区域的指针,若出错则为 MAP_FAILED(-1)。
mmap 函数要求内核创建一个新的虚拟内存区域,最好是从地址 start 开始的一个区域,并将文件描述符 fd 指定的对象的一个连续的片(chunk)映射到这个新的区域。连续的区域大小为 length 字节,从距文件开始处偏移量为 offset 字节 的地方开始。start 地址仅仅是一个暗示,通常被定义为 NULL。为了我们的目的,我们总是假设起始地址为 NULL。图 1 描述了这些参数的意义。
参数 prot 包含描述新映射的虚拟 ...
RocksDB -- 如何在众多 SST 中查找指定 key ?
1. 预备知识
对于一个 Get() 请求,RocksDB 是按 memtable -> inmutable memtable -> SST 文件 的顺序来查找指定 key 的。
SST 文件以 level 的形式组织。
在 L0,SST 文件的顺序即 flush 这些文件的时间顺序。
L0 的 SST 文件的 key 范围通常是重叠的(一个 SST 文件的 key 的范围的上、下限分别在 FileMetaData.smallest、FileMetaData.largest 中定义),所以我们查找一个 key 时,需要查找每个 L0 的 SST 文件。
Compaction 以从上层选择 SST 文件,并将其与下层的 SST 文件合并(这里认为层数越小,层级越高。例如,L0 是 L1 的上层)。从结果来看,L0 的 SST 文件会逐渐地向 LSM-Tree 下层移动。
Compaction 会排序 K/V 并把这些 K/V 划分到多个 SST 文件中。从 L1 开始到更下层,SST 文件依据 key 来排序,且各个 SST 文件的 key 范围是互斥的。
2. ...
Docker 将现有容器打包成镜像的方法
1. 场景
我们之前已经用 docker 创建好了一个容器。
我们对这个容器进行了修改,例如安装软件、修改文件、部署服务器等等。
我们现在要把修改后的这个容器制作成新的镜像,方便以后使用这个镜像直接创建与之相同的容器。
2. 命令说明1docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
关于 OPTIONS,有如下可选:
-a:指定新镜像的作者。
-c:使用 Dockerfile 指令来创建镜像。
-m:提交生成镜像的说明信息。
-p:在 commit 时,将容器暂停。
3. 实例演示对于本文中的场景,关于上述的 OPTIONS,没有用到 -c,其他几个可以自己看情况选择。
下面看一个例子:
-
首先在宿主机器上,执行 docker ps -a,查看本机上的所有容器:
12345678910111213141516171819[gukaifeng@dell2 ~]$ docker ps -aCONTAINER ID IMAGE COM ...