sed脚本技巧-在匹配内容后追加

SED编辑器修改文本,在匹配内容后追加

  • 最近使用宝塔建站,网址比较多的时候修改起来比较费时间,搞个shell脚本批量处理,实现功能 access_log /path/abc/file.log; 指定日志格式
sed -i 's#access_log.*\.log#& ngx_log#g'  /path/abc/file.log
  • 知识点: &用来表示模式匹配(正则表达式匹配)的范围

Html页面异步加载资源文件

同步加载cssjs资源文件造成阻塞,网页打开慢

异步加载方法一

  • 通过 JS 动态插入 link 标签来异步载入 CSS 代码,就像这样:
var myCSS = document.createElement( "link" );
myCSS.rel = "stylesheet";
myCSS.href = "mystyles.css";
document.head.insertBefore( myCSS, document.head.childNodes[ document.head.childNodes.length - 1 ].nextSibling );
  • 实现原理: 后续 JS 执行的时候,去创建一个 link 标签来加载 CSS 代码

异步加载二

  • 利用 link 上的 media 属性,将它设置为和用户当前浏览器环境不匹配的值,比如:media="print",甚至可以设置为一个完全无效的值 media="css-async" 之类的, 浏览器就会进行异步加载。加载完成后让css 生效, 使用onload="this.media='all'
<link rel="stylesheet" href="path/cssfile.css" media="jscourse" media="css-async" onload="if(media!='all')media='all'" rel="stylesheet">

异步方法三

  • 使用新规范rel="preload",例子如下

    • 加载完成后通过onload修改rel
    <link rel="preload" href="cssfile.css" as="style" onload="this.rel='stylesheet'">
    • 使用as预设属性
    <link rel="preload" href="scriptfile.js" as="script">
  • preload 中的 as 属性支持一下属性
audio
document
embed
fetch
font
image
object
script
style
track
worker
video

BT宝塔安装与账号免登录

宝塔基本安装

    使用 SSH 连接工具,如堡塔SSH终端连接到您的 Linux 服务器后,挂载磁盘,根据系统执行相应命令开始安装(大约2分钟完成面板安装):

Centos安装脚本 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh
Ubuntu/Deepin安装脚本 wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh
Debian安装脚本 wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && bash install.sh
Fedora安装脚本 wget -O install.sh http://download.bt.cn/install/install_6.0.sh && bash install.sh

免登陆修改

  • 登陆页面为前端加载效果
  • 绕过修改js文件/www/server/panel/BTPanel/static/js/index.js,将function show_force_bind() 取消即可

数据库慢查询问题处理

无用索引导致数据库慢查询问题处理

问题排查

  • 新接手的一个网站CPU跑满了,通过top发现是mysql异常,show processlist查看发现是大量的慢SQL到账的SELECT COUNT(*) FROM idmaps WHERE typeid=8 AND keyid=1085287221 AND showtype=0 , 查下表数据千万量级,ibd文件20几个G,数据不小呀,盘它
  • 垃圾代码害死人啊,分析下问题,顺便填坑
  • 检查表中索引show create table idmaps;
CREATE TABLE `idmaps` (
  `typeid` tinyint(3) unsigned NOT NULL DEFAULT '0',
  `keyid` int(10) unsigned NOT NULL DEFAULT '0',
  `myid` int(10) unsigned NOT NULL DEFAULT '0',
  `showtype` tinyint(3) unsigned NOT NULL DEFAULT '0',
  `exttype` int(10) unsigned NOT NULL DEFAULT '0',
  `sortnum` int(10) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`typeid`,`myid`,`keyid`),
  KEY `idx_list` (`typeid`,`keyid`,`showtype`,`sortnum`),
  KEY `idx_list2` (`typeid`,`keyid`,`showtype`,`exttype`,`sortnum`) USING BTREE,
  KEY `idx_ids` (`typeid`,`keyid`),
  KEY `typeid` (`typeid`),
  KEY `keyid` (`keyid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
  • 检查索引explain SELECT COUNT(*) FROM idmaps WHERE typeid=8 AND keyid=275787765 AND showtype=0;
    +----+-------------+--------+------+-------------------------------------------------+---------+---------+-------+------+-------------+
| id | select_type | table  | type | possible_keys                                   | key     | key_len | ref   | rows | Extra       |
+----+-------------+--------+------+-------------------------------------------------+---------+---------+-------+------+-------------+
|  1 | SIMPLE      | idmaps | ref  | PRIMARY,idx_list,idx_list2,idx_ids,typeid,keyid | PRIMARY | 1       | const |    1 | Using where |
+----+-------------+--------+------+-------------------------------------------------+---------+---------+-------+------+-------------+
  • 莫名其妙的PRIMARY KEY,执行时间20s+, 访问量起来后,基本直接卡死
mysql> SELECT COUNT(*) FROM idmaps WHERE typeid=8  AND keyid=275787765 AND showtype=0;
+----------+
| COUNT(*) |
+----------+
|        2 |
+----------+
1 row in set (21.80 sec)
  • 强制指定索引force index
mysql> SELECT COUNT(*) FROM idmaps force index(idx_ids)  WHERE typeid=8  AND keyid=275785755 AND showtype=0;
+----------+
| COUNT(*) |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)
  • 再强制指定索引
mysql> explain SELECT COUNT(*) FROM idmaps force index(idx_list) WHERE typeid=8  AND keyid=275787765 AND showtype=0;
+----+-------------+--------+------+---------------+----------+---------+-------------------+------+-------------+
| id | select_type | table  | type | possible_keys | key      | key_len | ref               | rows | Extra       |
+----+-------------+--------+------+---------------+----------+---------+-------------------+------+-------------+
|  1 | SIMPLE      | idmaps | ref  | idx_list      | idx_list | 6       | const,const,const |    2 | Using index |
+----+-------------+--------+------+---------------+----------+---------+-------------------+------+-------------+
1 row in set (0.00 sec)
  • 再来
mysql> SELECT COUNT(*) FROM idmaps force index(keyid)  WHERE typeid=8  AND keyid=275785755 AND showtype=0;
+----------+
| COUNT(*) |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)

分析过程

  • 导致此问题的原因明显是索引不当,结合数据库实际读写情况,检查SQL统计,PRIMARY KEY基本无用,尝试调整索引解决

处理结果

  • 经尝试,最简单办法直接删除alter table idmaps drop PRIMARY KEY;。 成功解决此慢查询问题,且不影响其它SQL预计。

Mysql数据库修改主键PRIMARY KEY

修改主键

  • 删除主键

    ALTER TABLE TABLENAME(表名) DRROP PRIMARY KEY
    
  • 增加主键

    ALTER TABLE TABLENAME(表名) ADD PRIMARY KEY (字段1)
    
  • 增加复合主键

    ALTER TABLE TABLENAME(表名) ADD PRIMARY KEY (字段1,字段2......)