MySQL批量kill被锁的线程

今天突然发现库量有大量时间很长的sleep线程,手动kill上百个id太累人了
1、show processlist;

导出命令格式的id文件
2、select concat(‘KILL ‘,id,’;’) from information_schema.processlist into outfile ‘/tmp/kill.txt’;

查看文件中是否都是需要的kill,不要随便全部都kill,然后导入执行命令
3、source /tmp/kill.txt;

发表在 服务器 | 标签为 | 留下评论

mysql快速生成插入亿级会员数据

今天突然想试试看亿级会员单表的性能,分三步,首先创建表,接着生成会员数据,最后导入既可。注意如果有索引必须先创建好,不然等你导入后再创建就。。。
还有记得要表要用MyISAM,如果是innodb应该超过24小时都完成不了。配置缓存参数也要调高,例如以下:
[mysqld]
myisam_max_sort_file_size = 30G
myisam_sort_buffer_size = 2048M

首先创建表结构,实际内容你们随便改了。

DROP TABLE IF EXISTS `member`;
CREATE TABLE `member` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '会员ID',
  `username` varchar(20) DEFAULT NULL COMMENT '用户名',
  `nickname` varchar(20) DEFAULT NULL COMMENT '会员呢称',
  `password` varchar(255) DEFAULT NULL COMMENT '用户密码',
  `mobile` varchar(11) DEFAULT NULL COMMENT '手机号码',
  `open_id` char(32) DEFAULT NULL COMMENT '微信公众号唯一ID',
  `price` int(11) DEFAULT '1' COMMENT '存款',
  `status` smallint(1) NOT NULL DEFAULT '1' COMMENT '用户状态:0 - 未启用;1 - 已启用',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `create_time` (`create_time`),
  KEY `price` (`price`) USING BTREE,
  KEY `username` (`username`),
  KEY `mobile` (`mobile`),
  KEY `open_id` (`open_id`),
  KEY `nickname` (`nickname`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='会员表';

接着用php循环生成模拟会员数据,代码:

ini_set('display_errors',1);            //错误信息
ini_set('display_startup_errors',1);    //php启动错误信息
error_reporting(-1);                    //打印出所有的 错误信息
set_time_limit(0);//防止超时
ini_set('memory_limit',"2048M");//怕内存太小

$strs="QWERTYUIOPASDFGHJKLZXCVBNM1234567890qwertyuiopasdfghjklzxcvbnm";//用于生成随机数

for ($j = 1;$j <= 50; $j++) {//循环50次一亿条
	$str='';
	for ($i = 1;$i <= 2000000; $i++) {//200万写入文件1次
		$str.=substr(str_shuffle($strs),mt_rand(0,strlen($strs)-7),6)."\t".getChar(2)."\t".substr(str_shuffle($strs),mt_rand(0,strlen($strs)-9),8)."\t". mt_rand(100000,199999).mt_rand(10000,99999)."\t".md5(uniqid(microtime(true),true))."\t".mt_rand(10000,99999)."\t".mt_rand(0,1)."\t".date("Y-m-d H:i:s", mt_rand(946659661,1551690447))."\n";
	}
	file_put_contents('member.sql', $str,FILE_APPEND);
}
echo ok;

function getChar($num)  // $num为生成汉字的数量
{
	$b = '';
	for ($i=0; $i<$num; $i++) {
		// 使用chr()函数拼接双字节汉字,前一个chr()为高位字节,后一个为低位字节
		$a = chr(mt_rand(0xB0,0xD0)).chr(mt_rand(0xA1, 0xF0));
		// 转码
		$b .= iconv('GB2312', 'UTF-8', $a);
	}
	return $b;
}

我生成一亿条数据大概10g,接下来就要快速插入数据了。
这里选择load data infile方式,命令如下:

use test;
load data infile '/data/member.sql' into table member(username,nickname,password,mobile,open_id,price,status,create_time);

最后就等待结果即可,2亿条导入时间大概需要21分钟,之后创建索引大概花了1个小时多几分钟, 可见索引创建在大表里面多难。
其它包括索引,查询大家都可以自己调整试试看效率如何。
接下来如何优化呢?

发表在 服务器 | 标签为 | 留下评论

2019阿里云域名优惠口令

阿里云2019【优惠口令】

续费/首年(优惠与同产品其他优惠如代金券、折扣等不能同时使用)
com英文域名续费:珠光宝气
cn英文域名续费:诸事顺利
xin域名续费:抱诚守信
xin域名注册:神来气旺

其他阿里云云产品优惠券(云服务器 ECS,关系型数据库 RDS 等)可以领取我的 优惠券链接

发表在 服务器 | 标签为 , | 留下评论

Eclipse、Android SDK、ADT搭建安卓开发环境

我的环境windows7,选择以下版本。

eclipse-jee-2018-12-R-win32-x86_64.zip

android-sdk_r24.4.1-windows.zip

ADT-23.0.6.zip

Eclipse

下载地址:https://www.eclipse.org/downloads/packages/选择对应的版本包下载即可。

这里我选择的是Eclipse IDE for Java EE Developers,Windows 64-bit版本。

Android SDK

下载地址:http://dl.google.com/android/android-sdk_r24.4.1-windows.zip

ADT(Android Development Tools)

下载地址:https://dl.google.com/android/ADT-23.0.6.zip

有没有感觉挺简单,都是压缩包。

Eclipse安装

下载完毕后,你会在你保存的地方看到一个压缩包文件,这就是eclipse,直接解压缩即可。解压完毕后即可使用,进入文件夹,双击Eclipse图标后,就可以启动Eclipse了,到这Eclipse就安装完毕了。

eclipse在线安装ADT插件

  • 1.启动Eclipse,然后在菜单栏上选择 Help > Install New Software
  • 2.单击 Add 按钮,在右上角
  • 3.在Name(名称)处输入”ADT Plugin”,Location(网址)处输入”https://dl-ssl.google.com/android/eclipse/”
  • 4.点击”OK”
  • 5.在软件对话框中,选中”Developer Tools”复选框,然后点击”Next”
  • 6.在下一个窗口中,您会看到一个要下载的工具列表。单击“Next”
  • 7.阅读并接受许可协议,然后单击“Finish”
  • 8.安装完成后,重新启动Eclipse

eclipse离线安装ADT插件

  • 1.下载ADT插件的zip文件(不要解压)
  • 2.启动Eclipse,然后在菜单栏上选择 Help > Install New Software
  • 3.单击 Add 按钮,在右上角
  • 4.在”Add Repository”对话框,单击”Archive”
  • 5.选择下载的adt-23.0.6.zip文件并单击”确认”。
  • 6.在Name(名称)处输入”ADT Plugin”,单击“Finish”
  • 7.在软件对话框中,选中”Developer Tools”复选框,然后点击”Next”
  • 8.在下一个窗口中,您会看到一个要下载的工具列表。单击“Next”
  • 9.阅读并接受许可协议,然后单击“Finish”
  • 10.安装完成后,重新启动Eclipse

配置ADT插件

  • 1.启动Eclipse,选择windows>preferences>android
  • 2.在选项卡中选择”Browse”,选择之前下载的Android SDK的zip文件(需要解压)的目录(解压后的目录),点击确定
  • 3.点击OK

到这里环境基本搭建完成!!

SDK和ADT都可以国内Android Studio网站下载到:http://tools.android-studio.org/

通过Android SDK Manage添加新的软件包

  • 1.启动SDK解压目录android-sdk-windows\SDK Manager.exe
  • 2.运行后出现如下界面,选择自己需要的Android版本,然后点击”Install X packages”。Installed 表示已经安装、Not installed表示没有安装!!   
  • 3.在新出现的界面中选择如下Accept或者Accept All,然后点击Install。Android SDK 管理器就开始下载并安装你所选的包了,我们等一段时间就OK了!

AVD Manage创建安卓虚拟机

  • 1.启动Eclipse,在菜单栏上点击图标、也可以执行android-sdk-windows\AVD Manager.exe
  • 2.点击Create按钮,进行如下设置,然后点击”OK”

  • 3.选中刚才创建的虚拟设备,然后点击“Start->Launch”,就可以启动 Android 模拟器了。

发表在 服务器 | 标签为 , | 留下评论

【原创】Eclipse调试LogCat无法显示内容

刚刚开始学习Eclipse编写Android安卓app,在调试过程中发现不能用Log.v/d/i/w/e任何方法在logcat不能输出任何东西,空白了。

点击导航栏中的Window,选择Preferences,进入编辑界面

选择Android->LogCat;进入如图所示的编辑界面,将Show logcat view if message priority is atleast:里的下拉选项选择

VERBOSE项,并点击OK!

最后重启Eclipse就能正常显示LogCat的打印信息了

发表在 服务器 | 标签为 , | 留下评论

【原创】vsftp被动模式启动iptables读取目录列表失败

今天开启了centos防火墙后发现我的vsftp不能用了。

首先在防火墙规则文件\etc\sysconfig\iptables中添加如下内容:

-A INPUT -p tcp –dport 30000:31000 -j ACCEPT

-A RH-Firewall-1-INPUT -p tcp -m state –state NEW -m tcp –dport 21 -j ACCEPT

接着在防火墙参数配置文件\etc\sysconfig\iptables-config中打开模块

IPTABLES_MODULES=”ip_conntrack_ftp”
IPTABLES_MODULES=”ip_nat_ftp”

service iptables restart重启防火墙,用lsmod |grep ftp查看模块是否开启。

最后在vsftp配置文件\etc\vsftpd\vsftpd.conf中开启被动模式和端口,添加如下内容:

pasv_enable=yes
#pasv_promiscuous=no
pasv_max_port=30000
pasv_min_port=31000

保存,service vsftpd restart重启ftp。

试试看你的ftp是否复活了。

 

 

发表在 服务器 | 标签为 | 留下评论

【原创】memcache默认11211端口漏洞 未授权禁止访问

今天发现有台服务器的Memcached被外部ip不停攻击,流量竟然能承受最大上G,但是整台服务器收到很大的访问影响。最后发现是因为这台没有默认开启绑定ip的限制。限制都是很简单的事情,犯了低级错误。

方法1、通过参数-l,绑定内部ip,这样外网就无法攻击了。

memcached -d -p 11211 -u memcached -m 1024 -u root -l 127.0.0.1 -c 1024 -P /tmp/memcached.pid

方法2、通过防火墙,我的环境是centos6。

打开\etc\sysconfig\iptables配置文件:

加入以下内容:

#阻止所有11211端口

-A INPUT -p tcp -m tcp –dport 11211 -j DROP

#指定内网ip访问 或者192.168.0.0/24指定网段都可以

-A RH-Firewall-1-INPUT -s 192.168.0.8/32 -p tcp -m state –state NEW -m tcp –dport 11211 -j ACCEPT

重启防火墙即可。

 

发表在 服务器 | 标签为 | 留下评论

【原创】yii2角色权限rbac中auth_rule规则表功能作用与使用

可以发现在auth_item表中有个字段rule_name关联到auth_rule,那它是用来做什么的呢?

都叫rule了,无非就是规则,在角色和角色权限下的规则。

创建\common\components\AuthorRule.php文件内容如下:

<?php
namespace common\components;

use yii\rbac\Rule;//从系统自带规则继承

/**
 * Checks if authorID matches user passed via params
 * 检查authorID是否与已经通过参数的用户匹配
 */
class AuthorRule extends Rule
{
    public $name = 'isAuthor';

    /**
     * @param string|integer $user the user ID.
     * @param Item $item the role or permission that this rule is associated with
     * @param array $params parameters passed to ManagerInterface::checkAccess().
     * @return boolean a value indicating whether the rule permits the role or permission it is associated with.
     */
    public function execute($user, $item, $params)//实现rule抽象类里的extends方法
    {
        return isset($params['userid']) ? $params['userid'] == $user : false;//把传送进来的用户id,与当前登录的用户id对比。
    }
}

\advanced\vendor\yiisoft\yii2\rbac\DbManager.php这里调用

if (!$this->executeRule($user, $item, $params)) {
    return false;
}

\advanced\vendor\yiisoft\yii2\rbac\BaseManager.php文件内checkAccess调用checkAccessFromCache或checkAccessRecursive,里面又调用executeRule,最后调用了execute,有点绕,自己按路径和顺序看看。

protected function executeRule($user, $item, $params)
{
    if ($item->ruleName === null) {
        return true;
    }
    $rule = $this->getRule($item->ruleName);//读取auth_rule表中对应的规则
    if ($rule instanceof Rule) {
        return $rule->execute($user, $item, $params);//执行对应的规则
    }

    throw new InvalidConfigException("Rule not found: {$item->ruleName}");
}

auth_rule表中的规则需要用add来添加,对应data字段是blob类型,保存的时候是先把对象序列化成字符串。读取资源流后用stream_get_contents转化成字符串再反序列化成对象。
以下为添加规则的代码。

$auth = Yii::$app->authManager;
// 添加规则
$rule = new \common\components\AuthorRule;//使用创建的类文件创建对象
$auth->add($rule);//执行后去看看表是不是多了一条记录

auth_rule表规则添加完了 怎么用呢?在控制器添加如下代码:

public function beforeAction($action)
{
   if (!parent::beforeAction($action)) {
      return false;//如果父类验证失败,则返回失败
   }
   $permission = $action->controller->module->requestedRoute;//访问的规则路由
   //允许的路由和对应规则参数传送进去进行,系统会调用添加的rule规则进行判断返回。
   if (Yii::$app->user->can($permission, ['article_id' => Yii::$app->request->get('id'),'userid'=>Yii::$app->user->getId()])) {
      return true;//如该用户能访问该请求,则进行返回
   }

   throw new \yii\web\UnauthorizedHttpException('无权查看');//如果没有该权限,抛出一个异常
}

以上我多了个文章参数,传什么由你自己定,我发现一个路由权限只能自定义一个规则,如果能有多个规则那就更灵活了,如何多个规则有人告诉我吗?

发表在 服务器 | 标签为 , | 留下评论

【原创】windows7定时运行bat文件无窗口模式运行简单方法

windows7计划任务定时运行bat的时候老是弹出一个窗口影响工作,网上搜索一般都是vbs方式,后来我发现只要在对应的计划任务->常规->选择不管用户是否登录都要运行,点确定,之后它运行的时候就不会弹出cmd窗口了。终于不影响工作了,简单方便。

发表在 服务器 | 标签为 | 留下评论

【原创】Yii2使用swiftMailer发送QQ邮件

今天想在监控上做一个yii2使用qq邮箱发送邮件的功能。

一、安装swiftMailer扩展

默认yii 2.0会有这个扩展,如果没有就安装。

composer require –prefer-dist yiisoft/yii2-swiftmailer

或者修改composer.json,require加入: “yiisoft/yii2-swiftmailer”: “*”,

二、开启QQ邮箱IMAP/STMP服务

进入你的QQ邮箱,进入账户界面->设置->账户->开启服务:IMAP/SMTP服务

这里的意思是可以使用imap.qq.com作为邮件接收服务器,smtp.qq.com作为邮件发送服务器。

IMAP是什么?
IMAP,即Internet Message Access Protocol(互联网邮件访问协议),您可以通过这种协议从邮件服务器上获取邮件的信息、下载邮件等。IMAP与POP3类似,都是一种邮件获取协议。区别就是一个有消息反馈,一个没反馈。

根据页面要求发送短信开启后可以获取授权码,相当于发送账号的密码,记得保存下来。

三、修改yii2配置文件

我是修改了advanced\common\config\main-local.php,加入以下内容:

<?php
return [
    'components' => [
      'mailer' => [
         'class' => 'yii\swiftmailer\Mailer',
         'useFileTransport' =>false,//这句一定有,false发送邮件,true只是生成邮件在runtime文件夹下,不发邮件
         'transport' => [
            'class' => 'Swift_SmtpTransport',
            'host' => 'smtp.qq.com',  //每种邮箱的host配置不一样
            'username' => 'xxx@qq.com',//用发送开启了功能的邮箱
            'password' => 'xxxxxx',//授权码
            'port' => '465',
            'encryption' => 'ssl',

         ],
         'messageConfig'=>[
            'charset'=>'UTF-8',
            'from'=>['xxx@qq.com'=>'admin']
         ],
      ],

四、控制器或命令行编写发送代码

$url='http://www.jd.com/';
$mail= Yii::$app->mailer->compose();
$mail->setTo('xxx@foxmail.com');
$mail->setSubject("上架了");
//$mail->setTextBody('zheshisha ');   //发布纯文字文本
$mail->setHtmlBody("<br>商品:<a href='".$url."' target='_blank'>购买地址</a>");    //发布可以带html标签的文本
if($mail->send())
 echo "success";
else
 echo "failse";

//批量多发
$users = ['xxx1@qq.com', 'xxx2@qq.com']; 
$messages = []; 
foreach ($users as $user) {
 $messages[] = Yii::$app->mailer->compose() 
 ->setTo($user) 
 ->setSubject('测试主题') 
 ->setHtmlBody('测试内容'); 
} 
Yii::$app->mailer->sendMultiple($messages);

还可以模板方式,发送附件等,具体看官方文档:

https://www.yiiframework.com/doc/guide/2.0/en/tutorial-mailing

 

发表在 服务器 | 标签为 , | 留下评论