class Locker
{
private static array $lockers = [];
/**
* 获取锁
* @param string $key 锁的唯一标识
* @param int $timeout 超时时间(秒),0表示无限等待
* @return bool 是否获取到锁
*/
public static function wait(string $key, int $timeout = 0): bool
{
$file = sys_get_temp_dir() . "/.lock_" . md5($key) . ".tmp";
$start_time = time();
while (true) {
// 检查是否超时
if ($timeout > 0 && (time() - $start_time) >= $timeout) {
return false;
}
// 尝试打开文件
$fp = @fopen($file, "c+");
if (!$fp) {
usleep(10000); // 等待10毫秒
continue;
}
// 尝试获取锁
if (flock($fp, LOCK_EX | LOCK_NB)) {
// 获取锁成功
self::$lockers[$key] = $fp;
return true;
} else {
// 获取锁失败,关闭文件句柄
fclose($fp);
usleep(10000); // 等待10毫秒后重试
}
}
}
/**
* 释放锁
* @param string $key 锁的唯一标识
* @return bool 是否成功释放
*/
public static function release(string $key): bool
{
if (!isset(self::$lockers[$key])) {
return false;
}
$fp = self::$lockers[$key];
if (is_resource($fp)) {
flock($fp, LOCK_UN); // 释放文件锁
fclose($fp); // 关闭文件句柄
}
unset(self::$lockers[$key]);
return true;
}
/**
* 检查是否持有某个锁
* @param string $key 锁的唯一标识
* @return bool 是否持有锁
*/
public static function isLocked(string $key): bool
{
return isset(self::$lockers[$key]) && is_resource(self::$lockers[$key]);
}
/**
* 析构时释放所有锁
*/
public function __destruct()
{
foreach (array_keys(self::$lockers) as $key) {
self::release($key);
}
}
}
使用:
if (!Locker::wait(md5("key"), 3)) {
recordlog("3秒内获取不到锁返回提示 请勿重复请求 ");
# 3秒内获取不到锁返回提示
exit_json(0, '请勿重复请求');
}
[42000][1071] Specified key was too long; max key length is 767 bytes
已email字段为例,改成latin1_bin :
alter table resume
modify email varchar(255) collate latin1_bin not null comment ’email’;
或者取左边一部分来做索引
CREATE INDEX fff ON resume(email (10));
MySQL 里 varchar(64) 采用utf-8编码,能存多少个汉字?或多少个字母?
MySQL 中 varchar(64) 采用 UTF-8 编码时的存储能力可通过以下维度分析:
一、存储汉字
- 字符数量
varchar(64)可直接存储 64 个汉字,因为定义长度单位为字符而非字节。
例如:varchar(64)字段可完整存入 “数据库设计规范与最佳实践”(假设总长度不超过 64 个汉字)。 - 字节占用
每个 UTF-8 汉字占 3 字节,64 个汉字共占64 × 3 = 192 字节。
(注:实际存储时会额外消耗 1-2 字节记录字段长度,但因64 < 255,仅需 1 字节长度前缀)
二、存储字母/数字
- 字符数量
可存储 64 个字母或数字,同样以字符为单位计算。
例如:varchar(64)可存入 “ABCDabcd1234…” 共 64 个字符。 - 字节占用
每个英文字符占 1 字节,总字节数为64 × 1 = 64 字节。
三、关键限制
- 总行长度限制
MySQL 单行所有字段的字节总和不得超过 65535 字节(含长度前缀和字段元数据)。
- 示例:若
varchar(64)存储 64 个汉字,总字节数为192 + 1 = 193 字节,远低于行限制。
- 编码版本差异
- MySQL 5.0 以上:
varchar(n)以字符为单位,兼容 UTF-8 汉字和字母混合存储。 - MySQL 4.0 以下:
varchar(n)以字节为单位(需避免使用旧版本)。
四、实际场景建议
- 混合存储
若字段包含汉字和字母混合内容,总字符数不超过 64 即可,MySQL 会自动处理字节转换。
例如:”用户ID_12345″(10 字符)占用10 × 3 = 30 字节(汉字部分) + ASCII 字符的 1 字节/字符。 - 字符集升级
推荐使用utf8mb4替代utf8,以支持更多 Unicode 字符(如 emoji),但需注意存储空间需求增加。
总结
- 汉字容量:64 个
- 字母/数字容量:64 个
- 实际存储:无需人工截断,MySQL 按字符计数自动管理。
- 风险提示:需确保总行长度不超过 65535 字节,避免设计多超长字段的表。
引用链接:
1.MySQL:一场由Char/Varchar 引起的战争!! – 知乎
2.mysql数据库:varchar类型可以存储多少个汉字,多少个数字 – 腾讯云
3.MySQL utf8编码的varchar最多能存多少个字符 – CSDN博客
4.mysql utf-8 中文 – CSDN博客
5.mysql的varcher类型长度 – 根号三
6.MySQL 数据库 varchar 到底可以存多少个汉字,多少个英文呢?我们来搞搞清楚 · Ruby China – ruby-china.org
7.数据库中varchar类型 最大长度是多少?[通俗易懂] – 腾讯云
8.mysql 64字节能存多少个汉字 – 51CTO博客
9.MySQL中varchar能存多少汉字、数字 – 阿里云开发者社区
10.mysql varchar可以存几个汉字 – CSDN博客
11.mysql varchar到底能存多少汉字? – CSDN博客
12.MySQL数据类型 – 程序员肥仔
13.mysql varchar 100 可以存多少汉字 utf8编码 – 51CTO博客
14.软件编程基础知识:mysql不同字段类型分别可以存储多少内容? – 学科学玩数码
15.MYSQL_第11章_MySQL数据类型详解 – YOLO
16.mysql一个汉字几个字符 mysql里汉字占几位 – 51CTO博客
17.mysql的varchar到底能存多少个字符 – 腾讯云
18.mysql数据类型char与varchar的区别 – 博客园
19.关于MySQL VARCHAR的错误经验,你中了几条? – 稀土掘金
pt-table-sync使用latin1编码格式无损同步
pt-table-sync --databases=db01 h=127.0.0.1,u=xxxx,p=xxx,A=latin1 h=8.8.8.8,u=xxxx,p=xxx,A=latin1 --lock=0 --charset=latin1 --no-bin-log --no-transaction --execute --print
编译php7.1 openssl3.x版本过高?
下载:
wget https://openssl.org/source/openssl-1.1.1u.tar.gz tar -xzvf openssl-1.1.1u.tar.gz cd openssl-1.1.1u
编译安装:
./config --prefix=/usr/local/openssl1.1 --openssldir=/usr/local/openssl1.1/ssl
make -j$(nproc)
make install
临时改环境变量:
export PATH=/usr/local/openssl1.1/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/openssl1.1/lib:$LD_LIBRARY_PATH
configure php:
./configure --with-mysqli --with-pdo-mysql --enable-mbstring --enable-fpm --with-gd=/usr --with-curl --with-mcrypt --with-openssl --with-freetype-dir --with-zlib --with-jpeg-dir --with-png-dir --with-xpm-dir --enable-pcntl --with-gmp --enable-zip --enable-bcmath --with-openssl=/usr/local/openssl1.1/ --with-openssl-dir=/usr/local/openssl1.1/
编译安装:(略)
MySQL8.0解除密码强度限制
SET GLOBAL validate_password.policy = 'LOW';
MySQL 8提供了密码验证策略,可通过系统变量设置:
LOW:基本长度要求。
MEDIUM:必须包含数字、大小写字母、特殊字符。
STRONG:增加更多字符类型和长度要求。
.sql.gz 直接解压导入MySQL,不创建临时sql文件
可以通过管道命令实现不生成临时文件的直接导入,具体操作如下:
- Linux/macOS系统
使用gzip解压管道配合mysql命令:
zcat 文件名.sql.gz | mysql -u用户名 -p 数据库名
或使用gunzip命令:
gunzip -c 文件名.sql.gz | mysql -u用户名 -p 数据库名
执行后会提示输入密码,输入正确密码即可开始导入。
- Windows系统
需安装gzip工具(如7-Zip或Git Bash),然后执行:
gzip -dc 文件名.sql.gz | mysql -u用户名 -p 数据库名
若使用PowerShell:
Get-Content 文件名.sql.gz | gunzip | mysql -u用户名 -p 数据库名
注意需提前配置好MySQL环境变量。
- 注意事项
- 确保.gz文件完整且未损坏。
- 大文件导入时建议添加
--max_allowed_packet参数调整包大小:bash zcat 大文件.sql.gz | mysql -u用户名 -p --max_allowed_packet=512M 数据库名 - 若需指定字符集,可在命令中添加
--default-character-set=utf8mb4。
引用链接:
1.Horain云–搭建邮件服务器 – HoRain云小助手
2.mysql怎么导入sql.gz文件 – ZOL问答
3.windows mysql 怎么导入gz文件 – 51CTO博客
4.如何将sql文件导入mysql – 腾讯云
5.将.sql文件导入到MySQL数据库具体步骤 – 脚本之家
6.MySQL数据库中直接导入sql文件操作方法 – CSDN博客
7.mysql导入sql.g z文件,sqlite迁移mysql(导入导出数据)-CSDN博客 – CSDN博客
8.快速轻松地将SQL文件导入MySQL数据库:一步步指南 – 腾讯云
9.使用php 将 .sql.gz 文件导入 mysql – 慕课网
10.mysql gz 文件导入 mysql导入文件命令_mob6454cc7945bd的技术博客_51CTO博客 – 51CTO博客
11.MySQL客户端命令一节将.sql文件导入MySQL – CSDN博客
12.如何将外部.sql文件导入到本地mysql数据库中,命令窗口实现 – CSDN博客
13.mysql 导入gz – 51CTO博客
14.Linux MySQL实用技巧:SQL文件导入解决方案 (linux mysql如何导入sql文件) – 树叶云
15.如何把sql文件导入mysql – PHP中文网
16.怎样把一个 sql 的文件导入 mysql 数据库中? – 乱指琴魔舞
17.SQL文件导入MySQL数据库的详细指南 – 阿里云开发者社区
18.mysql怎么导入sql文件-mysql导入sql文件的方法 – 华军软件园
19.MySQL gz文件备份导入多个数据库 – 51CTO博客
20.sql文件如何导入到mysql – php中文网
21.mysql怎么导入sql文件?3种方法快速实现 – 思至创研
22.sql文件怎么导入mysql – php中文网
23.mysql怎么导入sql文件,提供三种方式,总有一种适合你! – 十宴
24.MySQL数据库的导入方法 – 博客园
25.如何将sql文件导入mysql数据库 – php中文网
26.如何导入导出MySQL数据库—-*.sql文件操作 – 博客园
27.sql文件如何导入到mysql数据库 – 腾讯云
28.将sql文件导入mysql—sql文件导入mysql – 树叶云
29.MySQL中怎么导入SQL文件? – 网联职教先锋
Linux普通分区挂载
在Linux中挂载新硬盘是一个常见的操作,可以让你的系统识别并使用这个硬盘。下面是一步步指导如何挂载新硬盘:
- 查找新硬盘
首先,你需要找到新硬盘的标识。可以使用lsblk或fdisk -l命令来查看所有可用的存储设备。
lsblk
或者
sudo fdisk -l
这些命令会列出所有存储设备,包括分区和未分区的硬盘。注意新硬盘的名称,比如/dev/sdb。
- 创建分区(如果需要)
如果你还没有为硬盘创建分区,你需要先创建一个。使用fdisk或gparted工具来创建分区。这里以fdisk为例:
sudo fdisk /dev/sdb
在fdisk提示符下,输入n来创建一个新分区,然后按照提示操作(选择分区类型、分区大小等)。创建分区后,输入w保存更改并退出。
- 格式化分区(如果需要)
如果你需要给这个分区一个文件系统,可以使用mkfs命令。例如,如果你想创建一个ext4文件系统:
sudo mkfs.ext4 /dev/sdb1
- 创建挂载点
选择一个目录作为挂载点。例如,你可以创建一个名为/mnt/newdisk的目录:
sudo mkdir /mnt/newdisk
- 挂载硬盘
使用mount命令将新硬盘挂载到刚才创建的挂载点:
sudo mount /dev/sdb1 /mnt/newdisk
- 验证挂载
使用df -h或查看挂载点内容来验证硬盘是否成功挂载:
df -h
或者
ls /mnt/newdisk
- 持久化挂载(可选)
如果你希望在每次重启后自动挂载硬盘,你可以编辑/etc/fstab文件:
sudo nano /etc/fstab
在文件的末尾添加一行,指定挂载信息,例如:
/dev/sdb1 /mnt/newdisk ext4 defaults 0 0
保存并关闭文件。之后,每次启动系统时,系统会自动挂载这个硬盘。
- 使用UUID而非设备名(推荐)
为了防止设备名称改变导致挂载失败,最好使用UUID而不是设备名。首先,查找UUID:
sudo blkid /dev/sdb1
注意输出的UUID值。然后编辑/etc/fstab,使用UUID代替设备名:
UUID=your-uuid-here /mnt/newdisk ext4 defaults 0 0
这样即使硬盘设备名改变,系统也能正确挂载。
[Server] Plugin mysqlx reported: ‘Setup of socket: ‘/var/lib/mysql/mysqlx.sock’ failed, can’t create lock file /var/lib/mysql/mysqlx.sock.lock’
2025-05-15T12:31:13.701072Z 0 [ERROR] [MY-011300] [Server] Plugin mysqlx reported: ‘Setup of socket: ‘/var/lib/mysql/mysqlx.sock’ failed, can’t create lock file /var/lib/mysql/mysqlx.sock.lock’
因为移动了默认的数据目录导致/var/lib/mysql目录不存在,创建对应的目录即可
mkdir /var/lib/mysql/ && chown mysql:mysql /var/lib/mysql && chmod 755 /var/lib/mysql
[Warning] [MY-011068] [Server] The syntax ‘slave_skip_errors’ is deprecated and will be removed in a future release. Please use replica_skip_errors instead.
2025-05-15T12:24:59.648560Z 0 [Warning] [MY-011068] [Server] The syntax ‘slave_skip_errors’ is deprecated and will be removed in a future release. Please use replica_skip_errors instead.
replica_skip_errors=’1062,1032,1008′