标签归档:MySQL
MySQL索引失效
MySQL 8.0快速配置远程连接
— 创建用户并设置密码(默认密码有复杂度要求,这里使用新的验证方式 caching_sha2_password )
CREATE USER 'root'@'%' IDENTIFIED WITH caching_sha2_password BY 'Aa#111111111';
— 授予root权限
GRANT ALL ON *.* TO 'root'@'%';
UPDATE `mysql`.`user` SET `Grant_priv` = 'y' WHERE (`Host` = '%') and (`User` = 'root');
然后重启下MySQL就好了
如果root@%已经存在了则需要修改密码:
alter user 'root'@'%' identified by '123456';
其他配置:
不强制要求特殊字符:set global validate_password.special_char_count=0;
简单实现MySQL负载低时才继续运行任务,负载高的时候睡眠
public static function runSleep($sec = 10, $echo = null) {
while (true) {
$result = NoThingModel::getInstance()->db->select("show status like 'Threads_running'", [], false);
$result = reset($result);
if ($result) {
if ($result->Variable_name == 'Threads_running') {
if ($result->Value > 10) {
if ($echo) {
echo "sleep 10\n";
}
sleep($sec);
} else {
break;
}
} else {
break;
}
} else {
break;
}
}
}
MySQL二进制日志清理
- 查看过期天数
show variables like ‘%logs%’;
2. 设置过期天数(最大值为99)
set global expire_logs_days = 99;
MySQL8.0 支持binlog_expire_logs_seconds参数,顾名思义就是日志过期秒数。
自动二进制日志文件删除的天数。 默认值为0,表示“不自动删除”。 可能的删除发生在启动时和二进制日志刷新。
2.1 生效问题
flush logs;
如果你发现设置没有生效,可能需要执行此命令。
3. 查看现有的日志文件
SHOW BINARY LOGS;
4. 手动清理较旧日志
PURGE BINARY LOGS TO ‘mysql-bin.000007’;
将mysql-bin.000007以前的日志清理掉,又或者
PURGE BINARY LOGS BEFORE ‘2018-01-06 12:12:12’;
将2018-01-06 12:12:12以前的日志清理掉
5. 修改MySQL配置文件
expire_logs_days = 99
create table和主从复制一坑
正确:
CREATE TABLE `chapter_lock_reason` (
`id` INT(11) NOT NULL AUTO_INCREMENT
PRIMARY KEY (`id`)
);
错误的方式:
CREATE TABLE xxx.`chapter_lock_reason` (
`id` INT(11) NOT NULL AUTO_INCREMENT
PRIMARY KEY (`id`)
);
MySQL ARCHIVE 引擎,从库突然Can’t write; duplicate key in table ‘nopay_record” on query.
这是ARCHIVE引擎的BUG
Error ‘Can’t write; duplicate key in table ‘nopay_record” on query. Default database: ‘doufu’. Query: ‘insert into `nopay_record` (`user_id`, `novel_id`, `chapter_id`, `channel`, `created_at`) values (3927416, 365027, 2499984, NULL, ‘2017-12-29 23:38:01′)’
表结构:
CREATE TABLE `nopay_record` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`novel_id` int(11) NOT NULL,
`chapter_id` int(11) NOT NULL,
`channel` tinyint(4) DEFAULT NULL,
`created_at` timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00’,
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=ARCHIVE AUTO_INCREMENT=440357 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
改成innodb吧
[link]MySQL · BUG分析 · Rename table 死锁分析
xtrabackup 快速增量备份教程
xtrabackup –backup –compress –target-dir=/mysqlbackup/full –user=aaa –host=hostname –password=xxxx –databases=ggggg
xtrabackup –backup –compress –target-dir=/mysqlbackup/incr –incremental-basedir=/mysqlbackup/full –user=aaa –host=hostname –password=xxxx –databases=ggggg
–compress 压缩
MySQL UPDATE JOIN
JOIN似乎不太满足这里的需求子查询更好
UPDATE novel SET chat_num = (SELECT COUNT(*) FROM chats WHERE novel_id = ? AND status = 1) WHERE id = ?
UPDATE JOIN 似乎无法使用limit
UPDATE pay_record JOIN article_info ON article_info.id = pay_record.object_id SET novel_id = special_id WHERE ISNULL(novel_id) AND pay_record.id = 17;