ecstore-短信忽然发送不了了

周一,客服反馈商城的注册短信收不到。

检查了一下发现确定发送不了,但是代码都没改,怎么会这样子呢?第一个感觉就是会不会是通道的问题。

所以上网问同样用平台的人,答案是可以发送的。

那么问题就是我们自己的问题了。

所以,写个测试例子调试吧。

随便在控制器写个调用吧,代码如下:

$messengerModel = kernel::single('b2c_mdl_member_messenger');
$mobile = '15959******';
$tmpl = 'account-lostPw';
$data = array(
	'vcode'         => time(),
);
$sendType = 'notice';
$sender = 'b2c_messenger_sms';
$tmpl_name = 'messenger:b2c_messenger_sms/'.$tmpl;
$messengerModel->_send($sender,$tmpl_name,$mobile,$data,$tmpl,$sendType);
exit('OK...');

因为这个调用时没有反馈的,我们需要在调用的时候将通道反馈的信息打印出来,需要做些调试方式。具体就根据个人的喜欢调试吧。

最终,得到结果是短信通道的密码错误。

汗~

确定没有改呀。算了,重置吧。

然后,需要使用“清除系统中原有的与shopex用户中心关联的数据”来清除关联数据。

看这个名字有点怕怕,最后新建一个新站测试发现是没问题的,仅仅是清除关联激活的信息,其他的数据完整保留哈。

这个数据就是:全新安装ecstore后会出现要激活的账号跟密码,是免费注册的一个账号。激活了才会进入后台管理界面。

下面附上调试过程中的一些重点文件,记录一下,省的以后还要重新跟。

在app\b2c\lib\messenger\sms.php中的send($to,$title,$message,$config)方法是短信发送的封装方法,自动添加签名等信息。

在app\b2c\lib\messenger\smschg.php中的send($contents,$config,&$msg)方法是主要方法,这边就是最终的调用短信通道接口的所在,所以,需要返回接口的错误信息,需要在这边调试输出。

在app\base\lib\enterprise.php中的方法关系到账户密码的获取方法。而这些数据是保存在表sdb_base_setting中,获取的SQL语句是:

SELECT * FROM `sdb_base_setting` WHERE `key` LIKE ‘ecos.enterprise_info’

我直接将加密串更新进去,然后,测试就可以了。

END

 

SHELL-自动修改文件的所有者

最近,前端同仁反馈,模板目录经常性提示没有权限修改文件,经检查是里面的文件的所有人变了,具体为什么变,暂时没找到,那就弄个脚本让他们执行修改吧。

传入的参数是要修改的目录,必须是/data/Site/下的任意目录,其他的程序排除了。

提示:

这个脚本有权限的,chown需要管理员权限,而正常部署的账号是www结果是可以执行,但没有效果噢。

#!/bin/bash

checkroot="$1"
hasexist=$(echo $checkroot | grep "/data/Site/")
if [[ (${#checkroot} -gt 0) && ($hasexist!="") ]];
then
find $checkroot -type f -user root -exec chown www:www {} \;
fi

 

SHELL-常用的功能脚本

最近,大量测试虚拟机,结果安装复制很麻烦的,特别有时候需要重新配置常用项的内容。还是写一个脚本自动完成吧。

错误提示:

如果执行的时候出现“-bash: ./ecs.sh: /bin/bash^M: bad interpreter: No such file or directory”错误则将文件的格式保存为unix格式试试看。

目前有的功能:

  1. 网卡配置生成
  2. YUM 阿里云镜像
  3. 虚拟机 共享软件夹

源码如下

#!/bin/bash

if [ $(id -u) != "0" ]; then
    echo "You must be root to run this script"
    exit 1
fi

# 网卡配置生成
eth_generate()
{
	while true
	do
		read -p "please input network card's name:" eth_input_name
		read -p "please input network card's IP ADDR:" eth_input_ipaddr
		read -p "please input network card's Gate WAY:" eth_input_gateway
		if [[ ${#eth_input_name} -gt 0 && ${#eth_input_ipaddr} -gt 0 && ${#eth_input_gateway} -gt 0 ]];
		then
			break
		else
			echo '******'
		fi
	done
	ethconfig="/etc/sysconfig/network-scripts/ifcfg-$eth_input_name"
	if [ -e /etc/sysconfig/network-scripts/ifcfg-$eth_input_name ];
	then
		mv $ethconfig $ethconfig.bak.$(date +"%Y%m%d")
	fi
	echo "TYPE=Ethernet
BOOTPROTO=static
NAME=$eth_input_name
DEVICE=$eth_input_name
ONBOOT=yes
IPADDR=$eth_input_ipaddr
GATEWAY=$eth_input_gateway">>$ethconfig
	if [ -e $ethconfig ];
	then
		echo '##### config generate OK~! #####'
	fi
	service network restart
	mv /etc/resolv.conf /etc/resolv.conf.bak.$(date +"%Y%m%d")
	echo "nameserver 223.5.5.5
nameserver 223.6.6.6">>/etc/resolv.conf
	exit 1
}

# YUM 阿里云镜像
yum_source_aliyun()
{
	if grep -Eqi "release 6." /etc/redhat-release; then
		centosver='6'
	elif grep -Eqi "release 7." /etc/redhat-release; then
		centosver='7'
	fi
	if [[ centosver -eq 6 || centosver -eq 7 ]];
	then
		mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak.$(date +"%Y%m%d")
		curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-$centosver.repo
		echo '##### CentOS-Base.repo is download OK~! #####'
		yum makecache
		echo '##### CentOS-Base.repo CACHE is OK~! #####'
	fi
	exit 1
}

# 虚拟机 共享软件夹
# 1.执行之前请点击 设备 安装增强工具
# 2.设置 共享文件夹 设定 共享文件夹名称,脚本将用到
vbox_sharefloder()
{
	# 0
	echo '1.执行之前请点击 设备 安装增强工具'
	echo '2.设置 共享文件夹 设定 共享文件夹名称,脚本将用到'
	read -p "你是否已经准备好了?准备好请输入yes回车。" isok
	if [ "$isok" != "yes" ];
	then
		echo '请前往设置后再来尝试。'
		exit 1
	fi
	# 1
	read -p "请输入共享文件夹名称: " sharefoldername
	if [[ ${#sharefoldername} -le 0 ]];
	then
		echo "共享文件夹名称 必填"
		exit 1
	fi
	read -p "请输入您希望挂载到的目录,默认/data: " mountto
	if [ ${#mountto} -le 0 ];
	then
		mountto='/data'
	fi
	# 2
	yum install kernel-headers kernel-devel gcc* make -y
	if [ ! -e /mnt/cdrom ];
	then
		mkdir -p /mnt/cdrom
	fi
	# 3
	mount /dev/cdrom /mnt/cdrom
	cd /mnt/cdrom
	./VBoxLinuxAdditions.run
	# umount /mnt/cdrom
	# 4
	if [ ! -e $mountto ];
	then
		mkdir -p $mountto
	fi
	mount -t vboxsf $sharefoldername $mountto
	# 5
	cp /etc/fstab /etc/fstab.bak.$(date +"%Y%m%d")
	echo $sharefoldername $mountto vboxsf rw,gid=100,uid=1000,auto 0 0 >> /etc/fstab
}


#
SelectTo="$1"

#
echo "1: Auto generate network card config(as ifcfg-eth0)"
echo "2: YUM source mirror from aliyun"
echo "3: Visual Box's Tool set"
echo "0: DO NOTHING"

#
if [ ${#SelectTo} -le 0 ];
then
	read -p "Choice One To Setup (1,2,3 or 0): " SelectTo
fi

#
echo '-----';

case "${SelectTo}" in
1)
	eth_generate
	;;
2)
	yum_source_aliyun
	;;
3)
	vbox_sharefloder
	;;
0)
	exit 1
	;;
*)
	echo "you can run :$0 [1|2|3...]"
	exit 1
esac

PHP中将HTML的行内样式抽离为内嵌样式或者外联样式

<?php

/**
* 说明:
* 最近为了优化页面容量,需要将内嵌,行内样式,脚本等抽离成外联调用方式,一个个检查明显是
* 工作量浩大,花了一个下午时间写个脚本自动检查,配合使用。
*
* 功能:将行内样式抽离成内嵌样式,自动重命名元素的样式名
**/
function extractionInlineStyle( $url = 'http://www.163.com/' )
{
$content = file_get_contents( $url );

// 1.将行内样式抽离出来
preg_match_all( '/style=(\"|\')?([^\"\']*)(\"|\')?/', $content, $matchs );
// 1.1.去掉空格,md5生成类名
// 1.2.删除原码,替换类名
$styleStrings = '<style>';
//
$classCountNum = 1;
foreach( $matchs[0] as $stylekey=>$styleitem )
{
$styleNameMd5[ $stylekey ] = md5( $styleitem );
$styleNameID[ $stylekey ] = 'c_'.$classCountNum;
if( !isset($styleItems[ $styleNameMd5[ $stylekey ] ]) )
{
$styleItems[ $styleNameMd5[ $stylekey ] ] = $styleNameID[ $stylekey ];
$styleName[ $stylekey ] = "class={$matchs[1][$stylekey]}{$styleNameID[ $stylekey ]}{$matchs[3][$stylekey]}";
$styleStrings .= '.'.$styleNameID[ $stylekey ].'{'.str_ireplace(array("\r","\n"),'',$matchs[2][$stylekey]).'}';
$classCountNum++;
}else{
$styleName[ $stylekey ] = "class={$matchs[1][$stylekey]}{$styleItems[ $styleNameMd5[ $stylekey ] ]}{$matchs[3][$stylekey]}";
}
}
//
$styleStrings .= '</style>';
$styleStrings = preg_replace( '/\s\s+/', '', $styleStrings );
$content = str_ireplace( '</head>', $styleStrings."\n".'</head>', $content );
$content = str_ireplace( $matchs[0], $styleName, $content );

// 2.处理重复的class属性,只能处理class X 2的
// 2.1 将重复的第二个class删除
// 2.2 将重复的class内的值合并到第一个class中
preg_match_all( '/<([^>]*)class=(?<pclass1>(\"|\')(?<pclass11>([^\"\']*))(\"|\'))([^>]*)(?<=class)=(?<pclass2>(\"|\')(?<pclass22>([^\"\']*))(\"|\'))([^>]*)>/', $content, $matchsClass );
$strRepl = $matchsClass[0];
foreach( $strRepl as $sFkey=>$sFval )
{
$find = array(
0=>' class='.$matchsClass['pclass2'][$sFkey],
1=>' class='.$matchsClass['pclass1'][$sFkey],
);
$repl = array(
0=>'',
1=>' class="'.$matchsClass['pclass11'][$sFkey].' '.$matchsClass['pclass22'][$sFkey].'"'
);
$strRepl[ $sFkey ] = str_ireplace( $find, $repl, $sFval );
}
//
$content = str_ireplace( $matchsClass[0], $strRepl, $content );

exit( $content );
}

SyntaxError: unexpected token: identifier

最近在处理Javascript脚本的时候,做了净化(purify)处理,然后很多文件都出现了下面的错误:

SyntaxError: unexpected token: identifier

没啥经验,发现都在一行上怎么调试呢?

就写个PHP脚本处理吧

/**
* 根据列码获取内容
* https://www.*.cn/connect-getjscolbynum-1104-100-discussimg.html
**/
function getjscolbynum( $colnum = 6647, $colnumlen = 100, $file=’page-gallery’ )
{

switch($file){
case ‘page-gallery’:
$filename = ‘https://imgoss.*.cn/public/app/b2c/statics/js_mini/page-gallery.js’;
break;
case ‘max_footer_mini’:
$filename = ‘https://imgoss.*.cn/themes/MAX360buy/images/max_footer_mini.js’;
break;
case ‘discussimg’:
$filename = ‘https://imgoss.*.cn/public/app/b2c/statics/js_mini/discuss-img.js’;
break;

}
$ffff = file_get_contents( $filename );
echo substr($ffff,$colnum,$colnumlen);
}

通过比对,发现如果涉及到匿名函数的时候,后面的分号要特别注意了,必须写上分号,要不很容易出现上面这个错误提示。

SHELL定时任务执行后钉钉机器人通知

最近,服务器不稳定,一些定时任务居然会出现没有执行的情况,所以,今天抽空写一个公共库,方便执行完毕调用钉钉机器人通知一下。

使用方法:将下面的代码保存为SdevSHcommon.sh文件,然后在需要的地方调用,注意,路径的正确。另外就是代码中的e**************************************************************f位置要修改为钉钉机器人的token值。要不,通知会出现错误,或者,在调用的时候指定token值。

然后在需要的地方,增加:

trap ‘finishNotice “{DATETIME}\n我这个是替换测试” 180********’ EXIT

将上面的”{DATETIME}\n我这个是替换测试”替换成你需要的内容,180********改为你的钉钉账户号,或者不填写,则通知全体。如果没有修改默认的token值则需要指定第三个参数。

其他就看代码吧,很简单的。

**********

#!/bin/bash

#
# . ./SdevSHcommon.sh
#

#
# USAGE:
# DingNotice “通知内容” [“AT谁”] [“群机器令牌”]
#
DingNotice()
{
local URL=”https://oapi.dingtalk.com/robot/send?access_token=”
# 通知内容
local MSG=$1
# at 谁
local TO=$2
# 机器人授权令牌
local TOTOKEN=$3
#
if [ “${MSG}” == “” ]; then
echo “通知内容不能为空”
exit 1
else
local datetime=$(date +”%Y-%m-%d %H:%M:%S”)
MSG=`echo ${MSG} | sed “s/{DATETIME}/${datetime}/g”`
#echo ${MSG}” – “${TO}” – “${TOTOKEN}
#exit 1
MSG=”\”msgtype\”: \”text\”,
\”text\”: {
\”content\”: \”${MSG}\”
}”
fi
if [ “${TO}” != “” ]; then
MSG=${MSG}”,”
TO=”\”at\”: {
\”atMobiles\”: [
\”${TO}\”
],
\”isAtAll\”: false
}”
fi
if [ “${TOTOKEN}” == “” ]; then
TOTOKEN=${URL}”e**************************************************************f
else
TOTOKEN=${URL}${TOTOKEN}
fi
#echo $@
#echo ${MSG}” – “${TO}” – “${TOTOKEN}
#exit 1
curl \
${TOTOKEN} \
-H ‘Content-Type: application/json’ \
-d “{
${MSG}
${TO}
}”
}

# DingNotice “测试一下”

#
# trap finishNotice EXIT
#
finishNotice()
{
# 通知内容
local MSG=$1
# at 谁
local TO=$2
DingNotice ${MSG} ${TO}
}
# trap ‘finishNotice “{DATETIME}\n我这个是替换测试” 180********’ EXIT

xargs与tar合并查询文件并打包问题检查

今天在整理服务器上的日志的时候,希望能将日志打包保存之后再删除,然后就出现了问题了。

find /debugLog -mmin +21600 -type f -print | xargs tar cvf /debugLog_$(date +”%Y%m%d%H%M%S”).tar

会出现提示:

tar: Exiting with failure status due to previous errors

大意是上一步中存在错误,怎么查看错误是啥?

查一下,在《Linux常见问题解答–如何修复“tar:Exiting with failure status due to previous errors”》找到答案,只需要将v参数去掉就行。

使用下面的命令查看:

find /debugLog -mmin +21600 -type f -print | xargs tar cf /debugLog_$(date +”%Y%m%d%H%M%S”).tar

然后打印出好多的错误信息了:

tar: Removing leading `/’ from member names
tar: /debugLog/efast/20171204_b2c_apiv_apis_response_goods: Cannot stat: No such file or directory
tar: -: Cannot stat: No such file or directory
tar: get_all_list.txt: Cannot stat: No such file or directory
tar: /debugLog/wxauth/20180103_wxauth_115.239.174.134,: Cannot stat: No such file or directory
tar: 10.53.26.130.txt: Cannot stat: No such file or directory
tar: /debugLog/wxauth/20180103_wxauth_115.239.174.134,: Cannot stat: No such file or directory
tar: 10.53.29.194.txt: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors

对于第一行的错误,百度了一下,在《“tar: Removing leading `/’ from member names”的错误》找到答案,这个因为是相对路径的缘故,需要增加P参数。

命令改为:

# find /debugLog -mmin +21600 -type f -print | xargs tar cfP /debugLog_$(date +”%Y%m%d%H%M%S”).tar

然后,继续出现下面的错误了:

tar: /debugLog/efast/20171204_b2c_apiv_apis_response_goods: Cannot stat: No such file or directory
tar: -: Cannot stat: No such file or directory
tar: get_all_list.txt: Cannot stat: No such file or directory
tar: /debugLog/wxauth/20180103_wxauth_115.239.174.134,: Cannot stat: No such file or directory
tar: 10.53.26.130.txt: Cannot stat: No such file or directory
tar:/debugLog/wxauth/20180103_wxauth_115.239.174.134,: Cannot stat: No such file or directory
tar: 10.53.29.194.txt: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors

根据实际查看错误的文件名发现,这两个文件其实都有特殊:

/debugLog/efast/20171204_b2c_apiv_apis_response_goods – get_all_list.txt

/debugLog/wxauth/20180103_wxauth_115.239.174.134, 10.53.29.194.txt

因为xargs默认分割符是空格,所以,上面的就被分为5个文件了。

/debugLog/efast/20171204_b2c_apiv_apis_response_goods

get_all_list.txt

/debugLog/wxauth/20180103_wxauth_115.239.174.134,

10.53.29.194.txt

所以,我们需要将分割符换一下,代码改为下面形式就OK了~

find /debugLog -mmin +21600 -type f -print0 | xargs -0 tar cfP /debugLog_$(date +”%Y%m%d%H%M%S”).tar

完美解决,如果你需要压缩完毕后就直接删除文件,则需要增加参数

find /debugLog -mmin +21600 -type f -print0 | xargs -0 tar cfP /debugLog_$(date +”%Y%m%d%H%M%S”).tar –remove-files

就可以了。

介于上面的文件名问题,我比较不赞同直接增加参数,毕竟,架不住有时候文件名里面出现个/被解析为根目录呢?

使用下面命令麻烦了点,但是稍微比较保险,你说呢?

find /debugLog -mmin +21600 -type f -print -exec rm -rf {} \;

nginx-400 Bad Request Request Header Or Cookie Too Large

400 Bad Request
Request Header Or Cookie Too Large
nginx

今天尝试开启NGINX负载均衡,将公司的服务器连接在一起提供服务,结果,一直出现这个提示。

网上找了一圈,看到的答案都是不正确的,没办法,需要靠自己了。

下面是NGINX的配置:

upstream backend {
#server 10.*.*.*:80;
#server 10.*.*.*:8081;
#server 10.*.*.*:8082;
#server 10.*.*.*::8083;
server 127.0.0.1:80;
#server 127.0.0.1:8081;
#server 127.0.0.1:8082;
#server 127.0.0.1:8083;
}

仔细看了一下发现开启的测试的服务器是本机的80端口,然后80端口就是测试的主机,然后就不断的死循环了……

去掉就好了,好吧,不能太懒,也要注意小细节。

电商-京东平台促销活动的优惠券领取的链接是什么

今天,负责京东平台的同仁来找我,需要从促销活动页面获取优惠券的链接,好用于其他地方客户的领取。

简单的说就是:

需要优惠券领取地址,方便运营活动页面的设计。

提供了两个网址:

  • 活动页面
    https://pro.m.jd.com/mall/active/33PhyFfqMfMWfVLSn5UHUp7SfC8X/index.html?utm_source=pdappwakeupup_20170001
  • 早期优惠券领取入口
    http://coupon.m.jd.com/coupons/show.action?key=24cdda93b39d4133a3464809cda970f4&roleId=10127994&to=https://sale.jd.com/m/act/GYor7n5HsE6OljKu.html

分析过程

从早期优惠券领取的入口,我们知道这个链接需要传入三个参数:

  1. key
  2. roleId
  3. to

我们需要从活动页面获取这三个值。

在活动页面内,我们找了一下基本没有很明显的迹象可以让我们直接获取上面的三个值,那么一般我们都是需要将正常流程走一遍,获取一些数据来作分析的。

点击领取优惠券,我们在“网络”中捕获了:

https://api.m.jd.com/client.action?functionId=newBabelAwardCollection&body=%7B%22activityId%22%3A%2233PhyFfqMfMWfVLSn5UHUp7SfC8X%22%2C%22from%22%3A%22H5node%22%2C%22scene%22%3A%221%22%2C%22args%22%3A%22key%3D618376500fad492b8e02db7418b531e3%2CroleId%3D10233358%22%2C%22mitemAddrId%22%3A%22%22%2C%22geo%22%3A%7B%22lng%22%3A%22%22%2C%22lat%22%3A%22%22%7D%7D&client=wh5&clientVersion=1.0.0&sid=1f3a6d7ad52bb790fee8a22156f2c689&uuid=15087419827841016776661&area=&_=1516760674531&callback=jsonp3

这么一大串,经过转码,我们会很明显的发现蛛丝马迹:

上面就是我们转码之后的数据,很明显body就是我们期待的内容了。

将上面的key=618376500fad492b8e02db7418b531e3,roleId=10233358分别带入:

http://coupon.m.jd.com/coupons/show.action?key=618376500fad492b8e02db7418b531e3&roleId=10233358&to=https://sale.jd.com/m/act/GYor7n5HsE6OljKu.html

然后,OK了,正确。

简单吧。

2018.01.31 京东运营找我学,我就简单的写了一个步骤,看到这边的福利哈

操作步骤:
1.先打开活动页,获取活动页的网址(类似pro.m.jd.com)。
2.用火狐或者其他的现代浏览器(按F12打开开发者工具),打开上面的页面。
3.在开发者工具内点击“网络”,再点击右边的垃圾桶清除。
4.点击“活动页面中的优惠券领取按钮”
5.在网络页面会出现很多的网址,找到以“https://api.m.jd.com/client.action?”开头的链接。
6.点击上面的链接,在消息头中,点击编辑和重发,在“查询字符串”找到body开头的字符串,复制里面的内容。
7.将上面复制的“key=字符串,roleId=数字”这样子的字眼的,代入下面的网址中。
8.
http://coupon.m.jd.com/coupons/show.action?key=字符串&roleId=数字&to=第一步内的网址

MySQL-information_schema数据库的说明及延伸的用法

我们安装完MySQL后,使用客服端查看的时候,都会看到information_schema这个库,那么这个库是做什么的呢?

下面就来分享一下。

数据库表说明:

官方开发文档:information-schema

表名 用途说明
SCHEMATA 提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。
TABLES 提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。
COLUMNS 提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。
STATISTICS 提供了关于表索引的信息。是show index from schemaname.tablename的结果取之此表。
USER_PRIVILEGES 用户权限表给出了关于全程权限的信息。该信息源自mysql.user授权表。是非标准表。
SCHEMA_PRIVILEGES 方案权限表给出了关于方案(数据库)权限的信息。该信息来自mysql.db授权表。是非标准表。
TABLE_PRIVILEGES 表权限表给出了关于表权限的信息。该信息源自mysql.tables_priv授权表。是非标准表。
COLUMN_PRIVILEGES 列权限表给出了关于列权限的信息。该信息源自mysql.columns_priv授权表。是非标准表。
CHARACTER_SETS 字符集表提供了mysql实例可用字符集的信息。是SHOW CHARACTER SET结果集取之此表。
COLLATIONS 提供了关于各字符集的对照信息。
COLLATION_CHARACTER_SET_APPLICABILITY 指明了可用于校对的字符集。这些列等效于SHOW COLLATION的前两个显示字段。
TABLE_CONSTRAINTS 描述了存在约束的表。以及表的约束类型。
KEY_COLUMN_USAGE 描述了具有约束的键列。
ROUTINES 提供了关于存储子程序(存储程序和函数)的信息。此时,ROUTINES表不包含自定义函数(UDF)。名为“mysql.proc name”的列指明了对应于INFORMATION_SCHEMA.ROUTINES表的mysql.proc表列。
VIEWS 给出了关于数据库中的视图的信息。需要有show views权限,否则无法查看视图信息。
TRIGGERS 提供了关于触发程序的信息。必须有super权限才能查看该表。

都是保存跟我们的数据库及表相关的数据,那么我们平时怎么利用他呢?

    • 一、TABLES
      1. 获取库中的全部表SELECT
        TABLE_NAME
        FROM
        information_schema.tables
        WHERE
        table_schema = ‘ecs_backup’
      2. 获取库中的创建时间(create_time)早于/晚于/等于某个时间的表SELECT
        TABLE_NAME
        FROM
        information_schema.tables
        WHERE
        table_schema = ‘ecs_backup’
        AND
        create_time < ‘2018-01-09’
      3. 获取库中的更新时间(update_time)早于/晚于/等于某个时间的表SELECT
        TABLE_NAME
        FROM
        information_schema.tables
        WHERE
        table_schema = ‘ecs_backup’
        AND
        update_time < ‘2018-01-09’
    • 二、COLUMNS
      1. 获取表的必填(IS_NULLABLE)字段
        SELECT
        COLUMN_NAME,COLUMN_DEFAULT,DATA_TYPE,CHARACTER_SET_NAME,COLUMN_KEY,COLUMN_TYPE,COLUMN_COMMENT
        FROM
        `information_schema`.`COLUMNS`
        WHERE
        TABLE_SCHEMA=’ecs’
        AND
        `TABLE_NAME` = ‘b2c_orders’
        AND
        IS_NULLABLE=’NO’
        ORDER BY ORDINAL_POSITION ASC
    • 三、STATISTICS
      1. 获取表的索引
        SELECT
        INDEX_NAME,COLUMN_NAME
        FROM
        `information_schema`.`STATISTICS`
        WHERE
        TABLE_NAME = ‘sdb_b2c_orders’
        AND
        INDEX_SCHEMA = ‘ecstore’