竹磬网-邵珠庆の日记 生命只有一次,你可以用它来做些更多伟大的事情–Make the world a little better and easier


2110月/210

【Open Data】国外开放数据中心及政府数据开放平台汇总

发布在 邵珠庆

纽约政府开放数据平台

https://opendata.cityofnewyork.us/

美国官网数据超市

https://www.data.gov/

提供230,256个数据集、14个数据目录

新加坡政府开放数据平台

https://data.gov.sg/

提供1700个数据集、9个数据目录

休斯顿市开放数据门户网站

http://data.houstontx.gov/

247个数据集、12个数据目录

Academic Torrents

http://academictorrents.com/

共享大量数据集的分布式系统,提供445.96TB的研究数据

Hadoopilluminated.Com

http://hadoopilluminated.com/hadoop_illuminated/Public_Bigdata_Sets.html

提供国外开放数据网站相关信息,目前已集合35个查询途径

United States Census Bureau

https://www.census.gov/

美国人口普查局

Usgovxml.Com

http://usgovxml.com/

USGovXML.com是美国政府提供的公共Web服务和XML数据源的索引。USGovXML.com索引来自 美国政府所有3个分支机构以及董事会,委员会,公司和独立机构的数据来源。

Enigma.Com

https://www.enigma.com/

快速搜索和分析政府、公司和组织发布的数十亿份公共记录。

Datahub.Io

https://datahub.io/

发现和分享高质量数据集,与他人联系和分享知识。

Aws.Amazon.Com/Datasets

https://registry.opendata.aws/

帮助人们发现和共享通过AWS资源提供的数据集。

Databib.Org

http://databib.org/

开放数据网站导航

Quandl.Com

https://www.quandl.com/

金融,经济和替代数据集的主要来源,为投资专业人士提供服务。Quandl的平台被超过40万人使用,其中包括来自世界顶级对冲基金,资产管理公司和投资银行的分析师。

Figshare.Com

https://figshare.com/

研究论文上传网站,已有2600万+浏览量、750万+下载、800,000+上传、200万+文章

GeoLite Legacy Downloadable Databases

https://dev.maxmind.com/geoip/geoip2/geolite2/

IP地理定位数据库

Quora's Big Datasets Answer

https://www.quora.com/Where-can-I-find-large-datasets-open-to-the-public

公共开放数据集汇总

Kaggle Datasets

https://www.kaggle.com/datasets

数据文档,拥有20394个数据集

A Deep Catalog Of Human Genetic Variation

https://www.internationalgenome.org/data

国际基因组样本资源

Google Public Data

https://www.google.com/publicdata/directory

谷歌公开数据搜索网站

World Bank Data

https://data.worldbank.org/

世界银行开放数据搜索网站

NYC Taxi Data

http://chriswhong.github.io/nyctaxi/

纽约出租车数据开放平台

Open Data Philly

https://www.opendataphilly.org/

费城开放数据平台、16个数据目录、354个数据集

Grouplens.Org

https://grouplens.org/datasets/

提供9个数据集,关于书籍、电源、wiki数据集

UC Irvine Machine Learning Repository

http://archive.ics.uci.edu/ml/index.php

加州大学欧文机器学习库,提供481个数据集

Research-Quality Data Sets By Hilary Mason

http://web.archive.org/web/20150320022752/https://bitly.com/bundles/hmason/1

公共数据集汇总

National Climatic Data Center - NOAA

https://www.ncdc.noaa.gov/

美国国家环境信息中心,监测,评估和提供国家气候和历史天气数据和信息

ClimateData.Us

http://www.climatedata.us/

美国宇航局公布的美国气候数据

R/Datasets

https://www.reddit.com/r/datasets/

开放数据集汇总网站

MapLight

https://maplight.org/data/

关于货币的数据集

GHDx

http://ghdx.healthdata.org/

健康指标和评估研究所 - 来自世界各地的健康和人口统计数据集目录,包括IHME结果

St. Louis Federal Reserve Economic Data - FRED

https://fred.stlouisfed.org/

圣路易斯联邦储备银行数据开放网站,该网站提供丰富的经济数据和信息,以促进经济教育和加强经济研究。

New Zealand Institute Of Economic Research – Data1850

https://data1850.nz/

新西兰经济研究所,可在该网站下载自1850年以来的相关经济数据。

Dept. Of Politics @ New York University

http://www.nyu.edu/projects/politicsdatalab/datasupp_datasources.html

纽约大学政治数据中心

Open Data Sources

https://github.com/datasciencemasters/data

Github网站上的开放数据源总结

UNICEF Statistics And Monitoring

https://www.unicef.org/statistics/index_24287.html

联合国儿童基金会官网,开放世界各国家、地区的儿童状况报告

Undata

http://data.un.org/Default.aspx

联合国国际统计数据库,包含6,000多万个数据点,涵盖广泛的统计主题,包括农业,犯罪,通信,发展援助,教育,能源,环境,金融,性别,健康,劳动力市场,制造业,国民核算,人口与移民,科学技术,旅游,运输和贸易。

NASA SocioEconomic Data And Applications Center - SEDAC

https://sedac.ciesin.columbia.edu/

社会经济数据和应用中心,是美国国家航空航天局地球观测系统数据和信息系统(EOSDIS)中的分布式主动档案中心(DAAC)之一。

The GDELT Project

https://www.gdeltproject.org/#intro

GDELT博客是世界上最大的人类社会开放研究平台的最新新闻,公告,信息和应用程序的官方一站式存储库。

Sweden, Statistics

https://www.scb.se/en/

瑞典统计局,提供瑞典国家统计数据,包含26个数据集。

Github Free Data Source List

https://www.datasciencecentral.com/profiles/blogs/great-github-list-of-public-data-sets

Github公共数据集

StackExchange Data Explorer

https://data.stackexchange.com/

一个开源工具,用于对来自StackExchange网络的公共数据进行任意查询。

San Fransisco Government Open Data

https://datasf.org/opendata/

旧金山政府开发数据网站

IBM Blog Abour Open Data

https://www.datasciencecentral.com/profiles/blogs/the-free-big-data-sources-everyone-should-know

数据科学中心

Liver Tumor Segmentation Challenge Dataset

https://competitions.codalab.org/competitions/17094

Public Git Archive

https://github.com/src-d/datasets/tree/master/PublicGitArchive

Git Hub开放数据平台汇总

GHTorrent

http://ghtorrent.org/

Microsoft Research Open Data

https://msropendata.com/

来自Microsoft Research的免费数据集,以推进自然语言处理,计算机视觉和特定领域科学等领域的最新研究。

Open Government Data Platform India

https://data.gov.in/

印度开放政府数据(OGD)平台-data.gov.in-是一个用于支持印度政府开放数据倡议的平台。

Google Dataset Search (Beta)

https://toolbox.google.com/datasetsearch

谷歌数据集搜索门户

Data.Gov

http://data.gov/

它是美国政府免费提供有关气候和犯罪等各种惊人信息的门户。

Data.Gov.Uk

http://data.gov.uk/

有来自英国所有中央部门以及许多其他公共部门和地方当局的数据集。它充当有关一切信息的门户,包括商业与经济,犯罪与正义,国防,教育,环境,政府,卫生,社会和交通运输。

美国人口普查局(US Census Bureau)

https://www.census.gov/

该网站是有关政府掌握的有关美国公民生活的统计数据,包括人口,经济,教育,地理等。

中央情报局世界概况

https://www.cia.gov/library/publications/the-world-factbook/

世界上每个国家的事实;重点研究267个国家/地区的历史,政府,人口,经济,能源,地理,通讯,运输,军事和跨国问题。

欧盟开放数据门户

http://open-data.europa.eu/en/data/

数据的增长包括欧盟内部的经济发展以及欧盟机构内部的透明度,包括地理,地缘政治和金融数据,统计数据,选举结果,法律法规以及犯罪,健康,环境,交通运输和科学研究的数据。

加拿大开放数据

http://www.data.gc.ca/

包含许多政府和地理空间数据集的试点项目。它可以帮助您探索加拿大政府如何通过开放数据,开放信息和开放对话来提高透明度,加强问责制,提高公民参与度并推动创新和经济机会。

Datacatalogs.Org

https://opengovernmentdata.org/

它提供来自美国,欧盟,加拿大,CKAN等的开放政府数据。

美国国家教育统计中心

https://nces.ed.gov/

国家教育统计中心(NCES)是收集和分析与美国和其他国家/地区的教育相关数据的主要联邦实体。

英国数据服务

https://www.ukdataservice.ac.uk/

英国数据服务集合包括英国政府资助的主要调查,跨国调查,纵向研究,英国人口普查数据,国际总量,商业数据和定性数据。

2110月/210

大数据数据开放平台

发布在 邵珠庆

2015年国务院印发的《促进大数据发展行动纲要》,要求“2018年底前建成国家政府数据统一开放平台,率先在信用、交通、医疗、卫生、就业、社保、地理、文化、教育、科技、资源、农业、环境、安监、金融、质量、统计、气象、海洋、企业登记监管等重要领域实现公共数据资源合理适度向社会开放”,截止2019年,已经有50多个地市开放了平台,开放了约15个领域数据,包括教育科技、民生服务、道路交通、健康卫生、资源环境、文化休闲、机构团体、公共安全、经济发展、农业农村、社会保障、劳动就业、企业服务、城市建设、地图服务。 同时,研究显示,中国开放政府数据实践存在六个方面的主 要问题:数据量少、价值低、可机读比例低,开放的多为静态数据,数据授权协议条款含糊,缺乏便捷的数据获取 渠道,缺乏高质量的数据应用,缺乏便捷、及时、有效、公开的互动交流。最后基于研究的评估结果,为中国开放政府数据的发展提出了政策建议。

参考论文:

关键词:

电子政务;开放政府;政府数据;政府数据开放;大数据数据开放平台。


四川省

成都市公共数据开放平台

http://www.cddata.gov.cn/

已开放:602个数据集,60个部门,27301171条数据,39个API,12个应用

数据开放--四川省人民政府网站

http://www.scdata.net.cn/odweb/index.htm

达州市政府数据开放平台

http://data.dazhou.gov.cn/

雅安市人民政府数据开放栏目

http://www.yaan.gov.cn/shuju.html


北京市

北京市政务数据资源网

http://www.bjdata.gov.cn/jkfb/index.htm

56家单位、1147类数据集、7653万余条数据记录


上海市

上海市政府数据服务网

http://www.data.sh.gov.cn/home!toHomePage.action

https://data.sh.gov.cn/

开放数据项总量32312条 开放数据资源1958个 开放数据部门45个


天津市

天津市信息资源统一开放平台

https://data.tj.gov.cn/

21 个主题、39 个部门、384 个数据集、116 个数据接口


福建省

福建省公共信息资源统一开放平台

https://data.fujian.gov.cn/odweb/

697346300条数据; 698个数据资源; 37个部门;1318个API;3个应用

厦门市大数据开放平台

http://data.xm.gov.cn/

8896790条数据 、789个资源、327个API、39个部门


广东省

开放广东

http://gddata.gd.gov.cn/

2369个政府数据集,58个数据应用,超过1.39亿条政府数据

广东省金融数据开放平台

http://210.76.74.192/

佛山市政府数据开放平台

http://www.foshan-data.cn/

提供部门(个):49主题分类(个):25数据集(个):1071数据总量(个):45078449

深圳市政府数据开放平台

http://opendata.sz.gov.cn/

数据目录1,260个 数据总量121,338,216条 数据接口1,002个 调用次数1,945,673次

广州市政府数据统一开放平台

http://data.gz.gov.cn/

68个部门,1307个数据集,100248678数据量,81693下载量

数据东莞

http://dataopen.dg.gov.cn/dataopen/

36797385条数据、69个部门、714类资源、12757个数据包、2100037次浏览、173422次下

惠州市政府数据开放平台

http://data.huizhou.gov.cn/

3141349条数据、348个数据集、5个部门

珠海市民生数据开放平台

http://data.zhuhai.gov.cn/

#/ 已开放:195条数据;188个数据资源;74个部门

广东省政府数据统一开放平台-潮州市

http://gddata.gd.gov.cn/index.php/data/ls/Type/0/v/344.html

广东省政府数据统一开放平台-河源市

http://gddata.gd.gov.cn/index.php/data/ls/Type/0/v/339.html

江门市数据开放平台

http://data.jiangmen.gov.cn/

提供:26个部门、12个主题分类.299个开放数据集、65.21万条数据、1994次下载量

中山市政府数据统一开放平台

http://zsdata.zs.gov.cn/web/index

数据集总数215,机构部门56,数据条数1736366,下载总数43801

肇庆市人民政府数据开放平台

http://www.zhaoqing.gov.cn/sjkf/


贵州省

贵阳市政府数据开放平台

http://www.gyopendata.gov.cn/

已开放 6180610条数据, 2841个数据集 , 310个API, 52个市级部门 , 13个区县

遵义市政府数据开放平台

http://www.zyopendata.gov.cn/

171开放数据集;219个开放文件;30个部门

铜仁市政府数据开放平台

http://gztrdata.gov.cn/

累计提供310个数据资源,其中数据类型资源69个


海南省

海南省政府数据统一开放平台

http://data.hainan.gov.cn/

14个已开放数据集; 969个已开放API;34个已开放部门


河南省

河南省公共数据开放平台

http://data.hnzwfw.gov.cn/odweb/

32个部分,20个领域,3497200数据量,709数据集,1418API,8个应用


江西省

江西省政府数据开放网站

http://data.jiangxi.gov.cn/

9个部门 , 153192条数据; 72个数据目录; 1个接口


宁夏回族自治区

宁夏回族自治区数据开放平台

http://ningxiadata.gov.cn/odweb/index.htm

22个已开放部门;128个数据集类;343175条政府数据;13个应用;12个API;545544条访问量;456个下载量

石嘴山政府数据开放平台

http://szssjkf.nxszs.gov.cn/

已开放97个数据集,107个数据资源,32个部门

银川市城市数据开放平台

http://data.yinchuan.gov.cn/

提供:32个部门数据;228个开放数据目录数量、7832个数据总条数、45个API数量


山东省

山东公共数据开放网

http://data.sd.gov.cn/

59部门,34216目录,7.35亿数据,70284API,41应用

济南市公共数据开放网

http://www.jndata.gov.cn/

71个部门 2106个数据集 4300个接口 6506个文件

青岛公共数据开放网

http://data.qingdao.gov.cn/

2818个数据集、7260个API、25个领域、12个文件集


陕西省

陕西省公共数据开放平台

http://www.sndata.gov.cn/

57个部门1300多个可开放目录,省级部门已开放121个目录1654万条数据

哈尔滨市政府数据开放平台"

http://data.harbin.gov.cn/ 54个部门; 1059个数据集; 5167696条数据; 5782个数据文件; 2284个API; 7个APP


浙江省

浙江政务服务网“数据开放”专题网站

http://data.zjzwfw.gov.cn/

68个省级单位提供的350项数据类目,包含100项可下载 的数据资源,137个数据接口和8个移动APP

宁波市政府数据服务网

http://www.datanb.gov.cn/nbdatafore/web/indexpage.action

20类主题、432个资源、3065883数据


安徽省

合肥市政府数据开放平台

http://61.133.142.137

"已开放79个部门,3个数据种类,211233条数据

蚌埠市信息资源开放平台

http://data.bengbu.gov.cn/

数据总量140条,112次下载次数、29次调用次数、2837次浏览总数

黄山市人民政府数据开放栏目

http://www.huangshan.gov.cn/DataDevelopment/showTopicContentList/8/page_1.html


湖北省

武汉市政务公开数据服务网

http://www.wuhandata.gov.cn/whData/

"开放数据部门101家,开放数据集2192类,开放数据总量118417条,4个API,54个应用


湖南省

长沙市政府门户网站数据开放平台

http://www.changsha.gov.cn/data/

40个部门,236个接口,6个app


江苏省

苏州市政府数据开放平台

http://www.suzhou.gov.cn/dataOpenWeb/data

常州市政府数据开放平台

http://opendata.changzhou.gov.cn/

390705条数据; 198个数据资源; 24个部门


黑龙江省

哈尔滨市政府数据开放平台

http://data.harbin.gov.cn/

54个部门; 1059个数据集; 5167696条数据; 5782个数据文件; 2284个API; 7个APP

嫩江市政务公开统计数据

http://www.nenjiang.gov.cn/zwgk/tjsj/


新疆维吾尔自治区

新疆维吾尔自治区政务数据开放网

http://data.xinjiang.gov.cn/index.html


内蒙古自治区数据开放

http://gzw.nmg.gov.cn/zwgk/zdlyxxgk/sjkf/


台湾省

台湾

http://data.gov.tw/

38745个资料集,18个分类,649个部门


国家相关部门统计信息网站汇总

中国人民银行

http://www.pbc.gov.cn/diaochatongjisi/116219/index.html

主要包括社会融资规模、金融统计数据、货币统计、金融机构信贷收支统计、金融市场统计、企业商品价格指数等等,数据权威且容易查找,实用性强。

中国银行业监督管理委员会

Http://Www.Cbrc.Gov.Cn/Chinese/Home/DocViewPage/110009.Html

主要包括银行业的数据统计,包括资产负债规模、主要监管数据等。

中国证券监督管理委员会

http://www.csrc.gov.cn/pub/newsite/sjtj/

主要包括证券市场、期货市场相关数据,每天更新快报,并有周报、月报等定期更新。

中国银保险监督管理委员会

http://www.cbirc.gov.cn/cn/index.html

对银行业和保险业机构的公司治理、风险管理、内部控制、资本充足状况、偿付能力、经营行为和信息披露

中国国家统计局

http://www.stats.gov.cn/tjsj/

主要包括国家经济宏观数据,社会发展、民生相关重要数据及信息,非常全面,且定期发布统计出版刊物,实用性强。

国家数据

http://data.stats.gov.cn/

数据源来自国家统计局,但排版更清晰简洁,包括国计民生各个方面的月度数据、季度数据、年度数据、各地区数据、部门数据以及国际数据。

数据-中国政府网

http://www.gov.cn/shuju/

主要包括CPI、GDP、PPI、工业生产增长指数、固定资产投资、社会消费品零售总额、粮食产量等的指数统计,只列出了主要数据,数据来源于国家统计局,点击会跳转至统计局的国家数据网站。查找起来比较简洁清晰,适合需要快速获取这些基础数据的人群。 

中国经济数据库

https://www.ceicdata.com/zh-hans/products/china-economic-database

中国互联网信息中心

http://www.cnnic.cn/

主要包括互联网发展相关基础数据,相对第三方机构的互联网数据而言,数据更宏观且权威。


香港  https://data.gov.hk/sc/

澳门 https://www.dsec.gov.mo/home_zhmo.aspx

1411月/190

【喜欢就拿走系列-13】数据传输服务系统架构图

发布在 邵珠庆

266月/170

Mysql之binlog日志说明及利用binlog日志恢复数据操作记录

发布在 邵珠庆

众所周知,binlog日志对于mysql数据库来说是十分重要的。在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全备份+binlog日志恢复增量数据部分),化险为夷!

废话不多说,下面是梳理的binlog日志操作解说:

一、初步了解binlog
MySQL的二进制日志binlog可以说是MySQL最重要的日志,它记录了所有的DDL和DML语句(除了数据查询语句select),以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。
----------------------------------------------------------------------------------------------------------------------------------------------
DDL
----Data Definition Language 数据库定义语言
主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用。

DML
----Data Manipulation Language 数据操纵语言
主要的命令是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言
----------------------------------------------------------------------------------------------------------------------------------------------

mysqlbinlog常见的选项有以下几个:
--start-datetime:从二进制日志中读取指定等于时间戳或者晚于本地计算机的时间
--stop-datetime:从二进制日志中读取指定小于时间戳或者等于本地计算机的时间 取值和上述一样
--start-position:从二进制日志中读取指定position 事件位置作为开始。
--stop-position:从二进制日志中读取指定position 事件位置作为事件截至

*********************************************************************

一般来说开启binlog日志大概会有1%的性能损耗。
binlog日志有两个最重要的使用场景:
1)MySQL主从复制:MySQL Replication在Master端开启binlog,Master把它的二进制日志传递给slaves来达到
master-slave数据一致的目的。
2)自然就是数据恢复了,通过使用mysqlbinlog工具来使恢复数据。
binlog日志包括两类文件:
1)二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件
2)二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句select)语句事件。

二、开启binlog日志:
1)编辑打开mysql配置文件/etc/mys.cnf
[root@vm-002 ~]# vim /etc/my.cnf
在[mysqld] 区块添加
log-bin=mysql-bin 确认是打开状态(mysql-bin 是日志的基本名或前缀名);

2)重启mysqld服务使配置生效
[root@vm-002 ~]# /etc/init.d/mysqld stop
[root@vm-002 ~]# /etc/init.d/mysqld restart
Stopping mysqld: [ OK ]
Starting mysqld: [ OK ]

3)查看binlog日志是否开启
mysql> show variables like 'log_%';
+---------------------------------+---------------------+
| Variable_name | Value |
+---------------------------------+---------------------+
| log_bin | ON |
| log_bin_trust_function_creators | OFF |
| log_bin_trust_routine_creators | OFF |
| log_error | /var/log/mysqld.log |
| log_output | FILE |
| log_queries_not_using_indexes | OFF |
| log_slave_updates | OFF |
| log_slow_queries | OFF |
| log_warnings | 1 |
+---------------------------------+---------------------+
9 rows in set (0.00 sec)

三、常用的binlog日志操作命令
1)查看所有binlog日志列表
mysql> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 149 |
| mysql-bin.000002 | 4102 |
+------------------+-----------+
2 rows in set (0.00 sec)

2)查看master状态,即最后(最新)一个binlog日志的编号名称,及其最后一个操作事件pos结束点(Position)值
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 | 4102 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

3)flush刷新log日志,自此刻开始产生一个新编号的binlog日志文件
mysql> flush logs;
Query OK, 0 rows affected (0.13 sec)

mysql> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 149 |
| mysql-bin.000002 | 4145 |
| mysql-bin.000003 | 106 |
+------------------+-----------+
3 rows in set (0.00 sec)

注意:
每当mysqld服务重启时,会自动执行此命令,刷新binlog日志;在mysqldump备份数据时加 -F 选项也会刷新binlog日志;

4)重置(清空)所有binlog日志
mysql> reset master;
Query OK, 0 rows affected (0.12 sec)

mysql> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 106 |
+------------------+-----------+
1 row in set (0.00 sec)

四、查看binlog日志内容,常用有两种方式:
1)使用mysqlbinlog自带查看命令法:
注意:
-->binlog是二进制文件,普通文件查看器cat、more、vim等都无法打开,必须使用自带的mysqlbinlog命令查看
-->binlog日志与数据库文件在同目录中
-->在MySQL5.5以下版本使用mysqlbinlog命令时如果报错,就加上 “--no-defaults”选项

查看mysql的数据存放目录,从下面结果可知是/var/lib//mysql
[root@vm-002 ~]# ps -ef|grep mysql
root 9791 1 0 21:18 pts/0 00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql
mysql 9896 9791 0 21:18 pts/0 00:00:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock
root 9916 9699 0 21:18 pts/0 00:00:00 mysql -px xxxx
root 9919 9715 0 21:23 pts/1 00:00:00 grep --color mysql

[root@vm-002 ~]# cd /var/lib/mysql/
[root@vm-002 mysql]# ls
ibdata1 ib_logfile0 ib_logfile1 mysql mysql-bin.000001 mysql-bin.000002 mysql-bin.index mysql.sock ops test

使用mysqlbinlog命令查看binlog日志内容,下面截取其中的一个片段分析:
[root@vm-002 mysql]# mysqlbinlog mysql-bin.000002
..............
# at 624
#160925 21:29:53 server id 1 end_log_pos 796 Query thread_id=3 exec_time=0 error_code=0
SET TIMESTAMP=1474810193/*!*/;
insert into member(`name`,`sex`,`age`,`classid`) values('wangshibo','m',27,'cls1'),('guohuihui','w',27,'cls2')        #执行的sql语句
/*!*/;
# at 796
#160925 21:29:53 server id 1 end_log_pos 823 Xid = 17                  #执行的时间
.............

解释:
server id 1 : 数据库主机的服务号;
end_log_pos 796: sql结束时的pos节点
thread_id=11: 线程号

2)上面这种办法读取出binlog日志的全文内容比较多,不容易分辨查看到pos点信息
下面介绍一种更为方便的查询命令:
命令格式:
mysql> show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];
参数解释:
IN 'log_name' :指定要查询的binlog文件名(不指定就是第一个binlog文件)
FROM pos :指定从哪个pos起始点开始查起(不指定就是从整个文件首个pos点开始算)
LIMIT [offset,] :偏移量(不指定就是0)
row_count :查询总条数(不指定就是所有行)

mysql> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 125 |
| mysql-bin.000002 | 823 |
+------------------+-----------+
2 rows in set (0.00 sec)

mysql> show binlog events in 'mysql-bin.000002'\G;
*************************** 1. row ***************************
Log_name: mysql-bin.000002
Pos: 4
Event_type: Format_desc
Server_id: 1
End_log_pos: 106
Info: Server ver: 5.1.73-log, Binlog ver: 4
*************************** 2. row ***************************
Log_name: mysql-bin.000002
Pos: 106
Event_type: Query
Server_id: 1
End_log_pos: 188
Info: use `ops`; drop table customers
*************************** 3. row ***************************
Log_name: mysql-bin.000002
Pos: 188
Event_type: Query
Server_id: 1
End_log_pos: 529
Info: use `ops`; CREATE TABLE IF NOT EXISTS `member` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(16) NOT NULL,
`sex` enum('m','w') NOT NULL DEFAULT 'm',
`age` tinyint(3) unsigned NOT NULL,
`classid` char(6) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
*************************** 4. row ***************************
Log_name: mysql-bin.000002
Pos: 529
Event_type: Query
Server_id: 1
End_log_pos: 596
Info: BEGIN
*************************** 5. row ***************************
Log_name: mysql-bin.000002
Pos: 596
Event_type: Intvar
Server_id: 1
End_log_pos: 624
Info: INSERT_ID=1
*************************** 6. row ***************************
Log_name: mysql-bin.000002
Pos: 624
Event_type: Query
Server_id: 1
End_log_pos: 796
Info: use `ops`; insert into member(`name`,`sex`,`age`,`classid`) values('wangshibo','m',27,'cls1'),('guohuihui','w',27,'cls2')
*************************** 7. row ***************************
Log_name: mysql-bin.000002
Pos: 796
Event_type: Xid
Server_id: 1
End_log_pos: 823
Info: COMMIT /* xid=17 */
7 rows in set (0.00 sec)

ERROR:
No query specified

mysql>

上面这条语句可以将指定的binlog日志文件,分成有效事件行的方式返回,并可使用limit指定pos点的起始偏移,查询条数!
如下操作示例:
a)查询第一个(最早)的binlog日志:
mysql> show binlog events\G;

b)指定查询 mysql-bin.000002这个文件:
mysql> show binlog events in 'mysql-bin.000002'\G;

c)指定查询 mysql-bin.000002这个文件,从pos点:624开始查起:
mysql> show binlog events in 'mysql-bin.000002' from 624\G;

d)指定查询 mysql-bin.000002这个文件,从pos点:624开始查起,查询10条(即10条语句)
mysql> show binlog events in 'mysql-bin.000002' from 624 limit 10\G;

e)指定查询 mysql-bin.000002这个文件,从pos点:624开始查起,偏移2行(即中间跳过2个),查询10条
mysql> show binlog events in 'mysql-bin.000002' from 624 limit 2,10\G;

五、利用binlog日志恢复mysql数据

以下对ops库的member表进行操作
mysql> use ops;
mysql> CREATE TABLE IF NOT EXISTS `member` (
-> `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-> `name` varchar(16) NOT NULL,
-> `sex` enum('m','w') NOT NULL DEFAULT 'm',
-> `age` tinyint(3) unsigned NOT NULL,
-> `classid` char(6) DEFAULT NULL,
-> PRIMARY KEY (`id`)
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.10 sec)

mysql> show tables;
+---------------+
| Tables_in_ops |
+---------------+
| member |
+---------------+
1 row in set (0.00 sec)

mysql> desc member;
+---------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+---------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(16) | NO | | NULL | |
| sex | enum('m','w') | NO | | m | |
| age | tinyint(3) unsigned | NO | | NULL | |
| classid | char(6) | YES | | NULL | |
+---------+---------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

事先插入两条数据
mysql> insert into member(`name`,`sex`,`age`,`classid`) values('wangshibo','m',27,'cls1'),('guohuihui','w',27,'cls2');
Query OK, 2 rows affected (0.08 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from member;
+----+-----------+-----+-----+---------+
| id | name | sex | age | classid |
+----+-----------+-----+-----+---------+
| 1 | wangshibo | m | 27 | cls1 |
| 2 | guohuihui | w | 27 | cls2 |
+----+-----------+-----+-----+---------+
2 rows in set (0.00 sec)

下面开始进行场景模拟:
1)
ops库会在每天凌晨4点进行一次完全备份的定时计划任务,如下:
[root@vm-002 ~]# crontab -l
0 4 * * * /usr/bin/mysqldump -uroot -p -B -F -R -x --master-data=2 ops|gzip >/opt/backup/ops_$(date +%F).sql.gz

这里手动执行下,将ops数据库备份到/opt/backup/ops_$(date +%F).sql.gz文件中:
[root@vm-002 ~]# mysqldump -uroot -p -B -F -R -x --master-data=2 ops|gzip >/opt/backup/ops_$(date +%F).sql.gz
Enter password:
[root@vm-002 ~]# ls /opt/backup/
ops_2016-09-25.sql.gz
-----------------
参数说明:
-B:指定数据库
-F:刷新日志
-R:备份存储过程等
-x:锁表
--master-data:在备份语句里添加CHANGE MASTER语句以及binlog文件及位置点信息
-----------------
待到数据库备份完成,就不用担心数据丢失了,因为有完全备份数据在!!

由于上面在全备份的时候使用了-F选项,那么当数据备份操作刚开始的时候系统就会自动刷新log,这样就会自动产生
一个新的binlog日志,这个新的binlog日志就会用来记录备份之后的数据库“增删改”操作
查看一下:
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 106 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

也就是说, mysql-bin.000003 是用来记录4:00之后对数据库的所有“增删改”操作。

2)
早上9点上班了,由于业务的需求会对数据库进行各种“增删改”操作。
比如:在ops库下member表内插入、修改了数据等等:

先是早上进行插入数据:
mysql> insert into ops.member(`name`,`sex`,`age`,`classid`) values('yiyi','w',20,'cls1'),('xiaoer','m',22,'cls3'),('zhangsan','w',21,'cls5'),('lisi','m',20,'cls4'),('wangwu','w',26,'cls6');
Query OK, 5 rows affected (0.08 sec)
Records: 5 Duplicates: 0 Warnings: 0

mysql> select * from member;
+----+-----------+-----+-----+---------+
| id | name | sex | age | classid |
+----+-----------+-----+-----+---------+
| 1 | wangshibo | m | 27 | cls1 |
| 2 | guohuihui | w | 27 | cls2 |
| 3 | yiyi | w | 20 | cls1 |
| 4 | xiaoer | m | 22 | cls3 |
| 5 | zhangsan | w | 21 | cls5 |
| 6 | lisi | m | 20 | cls4 |
| 7 | wangwu | w | 26 | cls6 |
+----+-----------+-----+-----+---------+
7 rows in set (0.00 sec)

3)
中午又执行了修改数据操作:
mysql> update ops.member set name='李四' where id=4;
Query OK, 1 row affected (0.07 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> update ops.member set name='小二' where id=2;
Query OK, 1 row affected (0.06 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from member;
+----+-----------+-----+-----+---------+
| id | name | sex | age | classid |
+----+-----------+-----+-----+---------+
| 1 | wangshibo | m | 27 | cls1 |
| 2 | 小二 | w | 27 | cls2 |
| 3 | yiyi | w | 20 | cls1 |
| 4 | 李四 | m | 22 | cls3 |
| 5 | zhangsan | w | 21 | cls5 |
| 6 | lisi | m | 20 | cls4 |
| 7 | wangwu | w | 26 | cls6 |
+----+-----------+-----+-----+---------+
7 rows in set (0.00 sec)

4)
在下午18:00的时候,悲剧莫名其妙的出现了!
手贱执行了drop语句,直接删除了ops库!吓尿!
mysql> drop database ops;
Query OK, 1 row affected (0.02 sec)

5)
这种时候,一定不要慌张!!!
先仔细查看最后一个binlog日志,并记录下关键的pos点,到底是哪个pos点的操作导致了数据库的破坏(通常在最后几步);

先备份一下最后一个binlog日志文件:
[root@vm-002 ~]# cd /var/lib/mysql/
[root@vm-002 mysql]# cp -v mysql-bin.000003 /opt/backup/
`mysql-bin.000003' -> `/opt/backup/mysql-bin.000003'
[root@vm-002 mysql]# ls /opt/backup/
mysql-bin.000003 ops_2016-09-25.sql.gz

接着执行一次刷新日志索引操作,重新开始新的binlog日志记录文件。按理说mysql-bin.000003
这个文件不会再有后续写入了,因为便于我们分析原因及查找ops节点,以后所有数据库操作都会写入到下一个日志文件。
mysql> flush logs;
Query OK, 0 rows affected (0.13 sec)

mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 | 106 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

6)
读取binlog日志,分析问题。
读取binlog日志的方法上面已经说到。
方法一:使用mysqlbinlog读取binlog日志:
[root@vm-002 ~]# cd /var/lib/mysql/
[root@vm-002 mysql]# mysqlbinlog mysql-bin.000003

方法二:登录服务器,并查看(推荐此种方法)
mysql> show binlog events in 'mysql-bin.000003';

+------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------------------------------------------------------------+
| mysql-bin.000003 | 4 | Format_desc | 1 | 106 | Server ver: 5.1.73-log, Binlog ver: 4 |
| mysql-bin.000003 | 106 | Query | 1 | 173 | BEGIN |
| mysql-bin.000003 | 173 | Intvar | 1 | 201 | INSERT_ID=3 |
| mysql-bin.000003 | 201 | Query | 1 | 444 | use `ops`; insert into ops.member(`name`,`sex`,`age`,`gsan','w',21,'cls5'),('lisi','m',20,'cls4'),('wangwu','w',26,'cls6') |
| mysql-bin.000003 | 444 | Xid | 1 | 471 | COMMIT /* xid=66 */ |
| mysql-bin.000003 | 471 | Query | 1 | 538 | BEGIN |
| mysql-bin.000003 | 538 | Query | 1 | 646 | use `ops`; update ops.member set name='李四' where id= |
| mysql-bin.000003 | 646 | Xid | 1 | 673 | COMMIT /* xid=68 */ |
| mysql-bin.000003 | 673 | Query | 1 | 740 | BEGIN |
| mysql-bin.000003 | 740 | Query | 1 | 848 | use `ops`; update ops.member set name='小二' where id= |
| mysql-bin.000003 | 848 | Xid | 1 | 875 | COMMIT /* xid=69 */ |
| mysql-bin.000003 | 875 | Query | 1 | 954 | drop database ops |
| mysql-bin.000003 | 954 | Rotate | 1 | 997 | mysql-bin.000004;pos=4 |
+------------------+-----+-------------+-----------+-------------+----------------------------------------------------------------------------------------------------------------------------+
13 rows in set (0.00 sec)

或者:

mysql> show binlog events in 'mysql-bin.000003'\G;
.........
.........
*************************** 12. row ***************************
Log_name: mysql-bin.000003
Pos: 875
Event_type: Query
Server_id: 1
End_log_pos: 954
Info: drop database ops
*************************** 13. row ***************************
Log_name: mysql-bin.000003
Pos: 954
Event_type: Rotate
Server_id: 1
End_log_pos: 997
Info: mysql-bin.000004;pos=4
13 rows in set (0.00 sec)

通过分析,造成数据库破坏的pos点区间是介于 875--954 之间(这是按照日志区间的pos节点算的),只要恢复到875前就可。

7)
先把凌晨4点全备份的数据恢复:
[root@vm-002 ~]# cd /opt/backup/
[root@vm-002 backup]# ls
mysql-bin.000003 ops_2016-09-25.sql.gz
[root@vm-002 backup]# gzip -d ops_2016-09-25.sql.gz
[root@vm-002 backup]# mysql -uroot -p -v < ops_2016-09-25.sql
Enter password:
--------------
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */
--------------

--------------
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */
--------------

.............
.............

--------------
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */
--------------

这样就恢复了截至当日凌晨(4:00)前的备份数据都恢复了。

mysql> show databases;                        #发现ops库已经恢复回来了
mysql> use ops;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+---------------+
| Tables_in_ops |
+---------------+
| member |
+---------------+
1 row in set (0.00 sec)

mysql> select * from member;
+----+-----------+-----+-----+---------+
| id | name | sex | age | classid |
+----+-----------+-----+-----+---------+
| 1 | wangshibo | m | 27 | cls1 |
| 2 | guohuihui | w | 27 | cls2 |
+----+-----------+-----+-----+---------+
2 rows in set (0.00 sec)

mysql>

但是这仅仅只是恢复了当天凌晨4点之前的数据,在4:00--18:00之间的数据还没有恢复回来!!
怎么办呢?
莫慌!这可以根据前面提到的mysql-bin.000003的新binlog日志进行恢复。

8)
从binlog日志恢复数据
恢复命令的语法格式:
mysqlbinlog mysql-bin.0000xx | mysql -u用户名 -p密码 数据库名

--------------------------------------------------------
常用参数选项解释:
--start-position=875 起始pos点
--stop-position=954 结束pos点
--start-datetime="2016-9-25 22:01:08" 起始时间点
--stop-datetime="2019-9-25 22:09:46" 结束时间点
--database=zyyshop 指定只恢复zyyshop数据库(一台主机上往往有多个数据库,只限本地log日志)
--------------------------------------------------------
不常用选项:
-u --user=name 连接到远程主机的用户名
-p --password[=name] 连接到远程主机的密码
-h --host=name 从远程主机上获取binlog日志
--read-from-remote-server 从某个MySQL服务器上读取binlog日志
--------------------------------------------------------
小结:实际是将读出的binlog日志内容,通过管道符传递给mysql命令。这些命令、文件尽量写成绝对路径;

a)完全恢复(需要手动vim编辑mysql-bin.000003,将那条drop语句剔除掉)
[root@vm-002 backup]# /usr/bin/mysqlbinlog /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops

b)指定pos结束点恢复(部分恢复):
--stop-position=471 pos结束节点(按照事务区间算,是471)
注意:
此pos结束节点介于“member表原始数据”与更新“name='李四'”之前的数据,这样就可以恢复到更改“name='李四'”之前的数据了。
操作如下:
[root@vm-002 ~]# /usr/bin/mysqlbinlog --stop-position=471 --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops

mysql> select * from member;
+----+-----------+-----+-----+---------+
| id | name | sex | age | classid |
+----+-----------+-----+-----+---------+
| 1 | wangshibo | m | 27 | cls1 |
| 2 | guohuihui | w | 27 | cls2 |
| 3 | yiyi | w | 20 | cls1 |
| 4 | xiaoer | m | 22 | cls3 |
| 5 | zhangsan | w | 21 | cls5 |
| 6 | lisi | m | 20 | cls4 |
| 7 | wangwu | w | 26 | cls6 |
+----+-----------+-----+-----+---------+
7 rows in set (0.00 sec)

恢复截止到更改“name='李四'”之间的数据(按照事务区间算,是673)
[root@vm-002 ~]# /usr/bin/mysqlbinlog --stop-position=673 --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops

mysql> select * from member;
+----+-----------+-----+-----+---------+
| id | name | sex | age | classid |
+----+-----------+-----+-----+---------+
| 1 | wangshibo | m | 27 | cls1 |
| 2 | guohuihui | w | 27 | cls2 |
| 3 | yiyi | w | 20 | cls1 |
| 4 | 李四 | m | 22 | cls3 |
| 5 | zhangsan | w | 21 | cls5 |
| 6 | lisi | m | 20 | cls4 |
| 7 | wangwu | w | 26 | cls6 |
+----+-----------+-----+-----+---------+
7 rows in set (0.00 sec)

c)指定pso点区间恢复(部分恢复):
更新 name='李四' 这条数据,日志区间是Pos[538] --> End_log_pos[646],按事务区间是:Pos[471] --> End_log_pos[673]

更新 name='小二' 这条数据,日志区间是Pos[740] --> End_log_pos[848],按事务区间是:Pos[673] --> End_log_pos[875]

c1)
单独恢复 name='李四' 这步操作,可这样:
按照binlog日志区间单独恢复:
[root@vm-002 ~]# /usr/bin/mysqlbinlog --start-position=538 --stop-position=646 --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops

按照事务区间单独恢复
[root@vm-002 ~]# /usr/bin/mysqlbinlog --start-position=471 --stop-position=673 --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops

c2)
单独恢复 name='小二' 这步操作,可这样:
按照binlog日志区间单独恢复:
[root@vm-002 ~]# /usr/bin/mysqlbinlog --start-position=740 --stop-position=848 --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops

按照事务区间单独恢复
[root@vm-002 ~]# /usr/bin/mysqlbinlog --start-position=673 --stop-position=875 --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops

c3)
将 name='李四'、name='小二' 多步操作一起恢复,需要按事务区间,可这样:
[root@vm-002 ~]# /usr/bin/mysqlbinlog --start-position=471 --stop-position=875 --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops

查看数据库:
mysql> select * from member;
+----+-----------+-----+-----+---------+
| id | name | sex | age | classid |
+----+-----------+-----+-----+---------+
| 1 | wangshibo | m | 27 | cls1 |
| 2 | 小二 | w | 27 | cls2 |
| 3 | yiyi | w | 20 | cls1 |
| 4 | 李四 | m | 22 | cls3 |
| 5 | zhangsan | w | 21 | cls5 |
| 6 | lisi | m | 20 | cls4 |
| 7 | wangwu | w | 26 | cls6 |
+----+-----------+-----+-----+---------+
7 rows in set (0.00 sec)

这样,就恢复了删除前的数据状态了!!

-----------------
另外:
也可指定时间节点区间恢复(部分恢复):
除了用pos节点的办法进行恢复,也可以通过指定时间节点区间进行恢复,按时间恢复需要用mysqlbinlog命令读取binlog日志内容,找时间节点。

如上,误删除ops库后:
先进行全备份恢复
[root@vm-002 backup]# mysql -uroot -p -v < ops_2016-09-25.sql

查看ops数据库
mysql> select * from member;
+----+-----------+-----+-----+---------+
| id | name | sex | age | classid |
+----+-----------+-----+-----+---------+
| 1 | wangshibo | m | 27 | cls1 |
| 2 | guohuihui | w | 27 | cls2 |
+----+-----------+-----+-----+---------+
2 rows in set (0.00 sec)

mysql>

查看mysq-bin00003日志,找出时间节点
[root@vm-002 ~]# cd /var/lib/mysql
[root@vm-002 mysql]# mysqlbinlog mysql-bin.000003
.............
.............
BEGIN
/*!*/;
# at 173
#160925 21:57:19 server id 1 end_log_pos 201 Intvar
SET INSERT_ID=3/*!*/;
# at 201
#160925 21:57:19 server id 1 end_log_pos 444 Query thread_id=3 exec_time=0 error_code=0
use `ops`/*!*/;
SET TIMESTAMP=1474811839/*!*/;
insert into ops.member(`name`,`sex`,`age`,`classid`) values('yiyi','w',20,'cls1'),('xiaoer','m',22,'cls3'),('zhangsan','w',21,'cls5'),('lisi','m',20,'cls4'),('wangwu','w',26,'cls6')                               #执行的sql语句
/*!*/;
# at 444
#160925 21:57:19 server id 1 end_log_pos 471 Xid = 66    #开始执行的时间
COMMIT/*!*/;
# at 471
#160925 21:58:41 server id 1 end_log_pos 538 Query thread_id=3 exec_time=0 error_code=0    #结束时间
SET TIMESTAMP=1474811921/*!*/;
BEGIN
/*!*/;
# at 538
#160925 21:58:41 server id 1 end_log_pos 646 Query thread_id=3 exec_time=0 error_code=0
SET TIMESTAMP=1474811921/*!*/;
update ops.member set name='李四' where id=4     #执行的sql语句
/*!*/;
# at 646
#160925 21:58:41 server id 1 end_log_pos 673 Xid = 68    #开始执行的时间
COMMIT/*!*/;
# at 673
#160925 21:58:56 server id 1 end_log_pos 740 Query thread_id=3 exec_time=0 error_code=0   #结束时间
SET TIMESTAMP=1474811936/*!*/;
BEGIN
/*!*/;
# at 740
#160925 21:58:56 server id 1 end_log_pos 848 Query thread_id=3 exec_time=0 error_code=0
SET TIMESTAMP=1474811936/*!*/;
update ops.member set name='小二' where id=2      #执行的sql语句
/*!*/;
# at 848
#160925 21:58:56 server id 1 end_log_pos 875 Xid = 69   #开始执行的时间
COMMIT/*!*/;
# at 875
#160925 22:01:08 server id 1 end_log_pos 954 Query thread_id=3 exec_time=0 error_code=0    #结束时间
SET TIMESTAMP=1474812068/*!*/;
drop database ops
/*!*/;
# at 954
#160925 22:09:46 server id 1 end_log_pos 997 Rotate to mysql-bin.000004 pos: 4
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

恢复到更改“name='李四'”之前的数据
[root@vm-002 ~]# /usr/bin/mysqlbinlog --start-datetime="2016-09-25 21:57:19" --stop-datetime="2016-09-25 21:58:41" --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops

mysql> select * from member;
+----+-----------+-----+-----+---------+
| id | name | sex | age | classid |
+----+-----------+-----+-----+---------+
| 1 | wangshibo | m | 27 | cls1 |
| 2 | guohuihui | w | 27 | cls2 |
| 3 | yiyi | w | 20 | cls1 |
| 4 | xiaoer | m | 22 | cls3 |
| 5 | zhangsan | w | 21 | cls5 |
| 6 | lisi | m | 20 | cls4 |
| 7 | wangwu | w | 26 | cls6 |
+----+-----------+-----+-----+---------+
7 rows in set (0.00 sec)

[root@vm-002 ~]# /usr/bin/mysqlbinlog --start-datetime="2016-09-25 21:58:41" --stop-datetime="2016-09-25 21:58:56" --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops
mysql> select * from member;
+----+-----------+-----+-----+---------+
| id | name | sex | age | classid |
+----+-----------+-----+-----+---------+
| 1 | wangshibo | m | 27 | cls1 |
| 2 | guohuihui | w | 27 | cls2 |
| 3 | yiyi | w | 20 | cls1 |
| 4 | 李四 | m | 22 | cls3 |
| 5 | zhangsan | w | 21 | cls5 |
| 6 | lisi | m | 20 | cls4 |
| 7 | wangwu | w | 26 | cls6 |
+----+-----------+-----+-----+---------+
7 rows in set (0.00 sec)

[root@vm-002 ~]# /usr/bin/mysqlbinlog --start-datetime="2016-09-25 21:58:56" --stop-datetime="2016-09-25 22:01:08" --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops
mysql> select * from member;
+----+-----------+-----+-----+---------+
| id | name | sex | age | classid |
+----+-----------+-----+-----+---------+
| 1 | wangshibo | m | 27 | cls1 |
| 2 | 小二 | w | 27 | cls2 |
| 3 | yiyi | w | 20 | cls1 |
| 4 | 李四 | m | 22 | cls3 |
| 5 | zhangsan | w | 21 | cls5 |
| 6 | lisi | m | 20 | cls4 |
| 7 | wangwu | w | 26 | cls6 |
+----+-----------+-----+-----+---------+
7 rows in set (0.00 sec)

这样,就恢复了删除前的状态了!

总结:
所谓恢复,就是让mysql将保存在binlog日志中指定段落区间的sql语句逐个重新执行一次而已。

286月/160

阿里系列:OSS存储作为本地数据盘挂载

发布在 邵珠庆

https://github.com/aliyun/ossfs#ossfs

简介

ossfs 能让您在Linux/Mac OS X 系统中把Aliyun OSS bucket 挂载到本地文件 系统中,您能够便捷的通过本地文件系统操作OSS 上的对象,实现数据的共享。

功能

ossfs 基于s3fs 构建,具有s3fs 的全部功能。主要功能包括:

- 支持POSIX 文件系统的大部分功能,包括文件读写,目录,链接操作,权限, uid/gid,以及扩展属性(extended attributes)
- 通过OSS 的multipart 功能上传大文件。
- MD5 校验保证数据完整性。

安装

预编译的安装包

我们为常见的linux发行版制作了安装包:

- Ubuntu-14.04
- CentOS-7.0/6.5/5.11

请从版本发布页面选择对应的安装包下载安装,建议选择最新版本。

- 对于Ubuntu,安装命令为:

sudo apt-get update
sudo apt-get install gdebi-core
sudo gdebi your_ossfs_package

- 对于CentOS6.5及以上,安装命令为:(安装包下载https://github.com/aliyun/ossfs/releases)

sudo yum localinstall your_ossfs_package

- 对于CentOS5,安装命令为:

sudo yum localinstall your_ossfs_package --nogpgcheck

源码安装

如果没有找到对应的安装包,您也可以自行编译安装。编译前请先安装下列依赖库:

Ubuntu 14.04:

sudo apt-get install automake autotools-dev g++ git libcurl4-gnutls-dev \
libfuse-dev libssl-dev libxml2-dev make pkg-config

CentOS 7.0:

sudo yum install automake gcc-c++ git libcurl-devel libxml2-devel \
fuse-devel make openssl-devel

然后您可以在github上下载源码并编译安装:

git clone https://github.com/aliyun/ossfs.git
cd ossfs
./autogen.sh
./configure
make
sudo make install

运行

设置bucket name, access key/id信息,将其存放在/etc/passwd-ossfs 文件中, 注意这个文件的权限必须正确设置,建议设为640。

echo my-bucket:my-access-key-id:my-access-key-secret > /etc/passwd-ossfs
chmod 640 /etc/passwd-ossfs

将oss bucket mount到指定目录

ossfs my-bucket my-mount-point -ourl=my-oss-endpoint

示例

将my-bucket这个bucket挂载到/tmp/ossfs目录下,AccessKeyId是faint, AccessKeySecret是123,oss endpoint是http://oss-cn-hangzhou.aliyuncs.com

# 安装
sudo yum localinstall ossfs_1.79.9_centos6.5_x86_64.rpm
echo wzj:nnnnnnnnnnnn:xxxxxxxxxxxxxxxxxx > /etc/passwd-ossfs
chmod 640 /etc/passwd-ossfs
mkdir /home/oss

# 启动
ossfs weizaojiao /home/oss -ourl=http://oss-cn-qingdao-internal.aliyuncs.com
/etc/init.d/目录下建立文件ossfs,放入ossfs weizaojiao /home/oss -ourl=http://oss-cn-qingdao-internal.aliyuncs.com
chmod a+x /etc/init.d/ossfs
chkconfig ossfs on

# 卸载
umount /home/oss
# 跳过扫描
我们常用到的3个查找命令分别是whereis,find,locate。
这其中,find命令是最老实巴焦的一个,直接在指定的目录下进行搜索,如果实在不知道在哪,我们就用 find / -name xxx
而另外的两个命令在搜索之前,都要读取 /etc/updatedb.conf (文件检索数据库配置信息)这个文件。
一般,我们为了加速检索,我们经常 updatedb 一下,这时候,它俩就过滤掉一些没用的东西,进行检索。
updatedb.conf下的几个变量分别是:
PRUNE_BIND_MOUNTS="yes" //是否限制搜索
#PRUNENAMES=".git .bzr .hg .svn" //跳过的文件类型,不同后缀之间用空格隔开。这个功能默认是关闭的(用#注释掉了),如果需要打开需将#去掉
PRUNEPATHS="/tmp /var/spool /media /home/.ecryptfs /home/oss" //要跳过的路径,/media 表示其他硬盘
PRUNEFS="NFS nfs nfs4 rpc_pipefs afs binfmt_misc proc smbfs autofs iso9660 ncpfs coda devpts ftpfs devfs mfs shfs sysfs cifs lustre_lite tmpfs usbfs udf fuse.ossfs" //要搜索的文件系统

常用设置

- 使用ossfs --version来查看当前版本,使用ossfs -h来查看可用的参数

- 如果使用ossfs的机器是阿里云ECS,可以使用内网域名来避免流量收费和 提高速度:

- ossfs my-bucket /tmp/ossfs -ourl=http://oss-cn-hangzhou-internal.aliyuncs.com

- 在linux系统中,updatedb会定期地扫描文件系统,如果不想 ossfs的挂载目录被扫描,可参考FAQ设置跳过挂载目录

- 如果你没有使用eCryptFs等需要XATTR的文件系统,可 以通过添加-o noxattr参数来提升性能

- ossfs允许用户指定多组bucket/access_key_id/access_key_secret信息。当 有多组信息,写入passwd-ossfs的信息格式为:
bucket1:access_key_id1:access_key_secret1
bucket2:access_key_id2:access_key_secret2

- 生产环境中推荐使用supervisor来启动并监控ossfs进程,使 用方法见FAQ

高级设置

- 可以添加-f -d参数来让ossfs运行在前台并输出debug日志
- 可以使用-o kernel_cache参数让ossfs能够利用文件系统的page cache,如 果你有多台机器挂载到同一个bucket,并且要求强一致性,请不要使用此 选项

遇到错误

遇到错误不要慌:) 按如下步骤进行排查:

- 如果有打印错误信息,尝试阅读并理解它

- 查看/var/log/syslog或者/var/log/messages中有无相关信息

- grep 's3fs' /var/log/syslog
grep 'ossfs' /var/log/syslog

- 重新挂载ossfs,打开debug log:
ossfs ... -o dbglevel=debug -f -d > /tmp/fs.log 2>&1

然后重复你出错的操作,出错后将/tmp/fs.log保留,自己查看或者发给我

局限性

ossfs提供的功能和性能和本地文件系统相比,具有一些局限性。具体包括:

- 随机或者追加写文件会导致整个文件的重写。
- 元数据操作,例如list directory,性能较差,因为需要远程访问oss服务器。
- 文件/文件夹的rename操作不是原子的。
- 多个客户端挂载同一个oss bucket时,依赖用户自行协调各个客户端的行为。例如避免多个客户端写同一个文件等等。
- 不支持hard link。
- 不适合用在高并发读/写的场景,这样会让系统的load升高

297月/150

D3.js 接触

发布在 邵珠庆

1. 初识D3.js

相信大多数人对D3.js并不陌生。这是一个由纽约时报可视化编辑 Mike Bostock与他斯坦福的教授和同学合作开发的数据文件处理的JavaScript Library,全称叫做Data-Driven Documents。

D3的应用非常广泛,现在 成为了主流数据可视化工具之一,下图仅仅是给出了D3.js广泛应用的冰山一角。更多的作品可以访问这里

纽约时报出品的一些赫赫有名的数据产品,也都使用了D3.js,比如 “512 Paths to the White House”以及奥巴马2013财政计划

512waysToTheWhiteHouseNYT

nytimes_obama_budget2013

2.用D3.js制作动态图表

笔者手里有一份美国各大投资管理公司雇员数量从2000年到2012年的数据。这是一份应该算是最简单的,不需要任何整理的数据资料 —一张Excel表格中明确列出公司名字、年份、雇员数量。从这张表格开始,到最后成功使用D3完成图表,对于一个初学JavaScript的人来讲是一个艰难而充满乐趣的过程。幸运的是,这是一份整齐简单的数据,因此笔者可以直接跳过整理数据这一步。

– 设计的重要性

在设计之前,要想清楚以下一些基本问题:

数据点(data point)有哪些?

哪些内容是读者期待的?哪些是记者想要表现的?

用什么样的形式、动态效果表现数据?

数据作为单独内容还是伴以文字报道?

最适合制作的可视化的工具是什么?

作为新手,这个步骤尤其关键,多和产品经理以及文字编辑沟通,设计好最理想的方案是进行下一步的必要条件。笔者的作品可以作为一个反面教材。

初稿

终稿

由于各公司的规模不同,如果单一展示13年来雇员数量上的变化,很难看出各家公司成长和衰落的速度。因此以在第一版设计稿中,专门将雇员数量百分比变化拿出来单做了曲线图。关于曲线图,柱状图,饼图,甚至气泡,或者使用自定义的图片、图标等等选择需要依照具体情况来确定。笔者选择了最简单的线、柱图,是为了更加容易上手。

然而,按照第一版设计,将图表做出来后,发现操作体验并不好。由于图表上每一个元素都可以用来驱动效果(坐标轴、曲线、柱状图、年份、年份指示点等),反而会使读者略感困扰。并且,即使取消某些驱动,由于上下两图分开展示,读者体验不够流畅。另外一个先前没有注意到的巧合是,公司数量和年份数目都是13,柱状图和图表最上方时间轴的意外的对应有会产生误解。所以,最后不得不放弃第一版,重新设计下面的样式。

在新闻编辑室做图表设计,由于刊物的风格,受众的特殊,会有不同的限制,但总的来说有以下一些需要注意的方面:

 配色:要根据刊物的风格,选择合适且不超过三个以上的主色调。(一个由于元素过多令人难以消- 化的例子是卫报的同性恋权益报道)。

字体:考虑读者的年龄群。笔者所在的集团主要做商业投资和养老保险的报道,读者群主要是中年= 人士。这样便不易选择较小字号和较浅的颜色。

操作功能:操作越人性化、越明确越好。尽量让读者在不超过三次点击的情况下呈现出所有的数据变化可能性。

有关数据可视化设计的一些原则,可以参考本站《数据可视化三大致命错误》《信息图四宗罪》,以及 “Stephen Few on Data Visualization: 8 Core Principles”。

– 程序编写以及与IE的斗争

由于笔者第一次从头开始写 JavaScript 脚本,所以先学习了许多网上的资源,列表附在本文结尾。然而,除去外部参考资料,最核心也是最重要的资源就是D3 API Reference了。这是一个在编写D3文件时应该永远打开的页面。

JavaScript不是一个非常严谨的语言,因而比较容易上手。这里说的严谨,仅指在编写过程中,对格式、标点等要求没有其他语言要求那么精确。这是一把双刃剑,一方面,大多数现代浏览器可以自动识别并且运行一份不完美的JavaScript文件(当然,这里只是说少量的符号小错误);另一方面,这样的不严谨会令后期修改文件、功能变得更加复杂,同时,稍旧一点的浏览器无法实现许多功能。

不幸的是,“稍旧一点的浏览器”中就包括了现在仍然在各大公司中广泛使用的Windows IE8浏览器。D3.js生来不兼容IE8及以下的浏览器,但一个产品推出之际,很少有公司能够像纽约时报那样大笔一挥,放弃掉众多IE8用户。这个时候,R2D3就显示出了他强大的兼容功能。R2D3是一个以Raphael.js支持的D3兼容包。使用起来也非常简单,只需要在文件的head中增加一行指向文件,让IE8-用户不运行d3.js而改为运行R2D3.js即可。

PaulIrishMakingFunOfIE

前端工程师大牛Paul Irish讽刺IE浏览器 >>>

与IE的斗争不仅在使用D3.js过程中会遇到,IE8及以下的浏览器(以及安卓2.3及以下版本)不支持可伸缩向量图形(SVG)以及HTML5 canvas,那么,所有在这些“画布”上的创作,都需要借助其他JS library来向下兼容。更多关于浏览器支持元素的查询可以点击这里

在程序的编写过程中,笔者得到了许多帮助,作为一个没有“程序员逻辑”的记者,无数次的返工让我体会到了“大局观”的重要性。以下几点是在编写程序过程中笔者的体悟:

“懒”是生产力:因为懒,所以希望电脑自动来做一切。正确的程序代码是可以实现这个目标的(在可视化范畴内),因此不要因为觉得“实现不了某项功能”而轻易放弃想法。

特殊情况也要自动解决:在遇到个别特殊数据时(比如空白数据),不应手动解决每个特殊问题,而要让程序拥有识别特殊性的能力,这是一套dynamic的程序应该有的功能。

3.新闻工作室的未来 — 人人都是多面手?

制作完人生第一个D3动态图表之后,笔者过足了写JavaScript的瘾,却觉得有些茫然。

记者本身是写作者、记录者,不断追求探索的是“事实”二字。没有什么比白纸黑字的数字更令人信服的,于是一直以来记者们对数据的探索趋之若鹜。随着大数据时代的到来,媒体对记者们的要求不断增加:既要有新闻记者敏锐的嗅觉和精准的写作,也要有利用数据的能力。这个“利用”的程度到底是怎样的呢?找到数据?展示数据?解释数据?可视化还是纯文字?

放眼各个新闻名校,都在不断加强着培养学生的“数据能力”。看新闻院校毕业后求职情况,会发现越多的数据处理能力意味着越高的求职成功率。彼此竞争、纸媒衰落的时代里,当每个记者都意识到数据的重要性而开始探索时,记者必备的能力中会不会有“编程”这一项?当未来的记者都成为了半个程序员的时候,在职记者又该学些什么,以免落后于时代呢?

 有兴趣的读者可以参考各大新闻院校开设的数据新闻课程,数据新闻网授权转载了几家新闻院校的课程:

-《走进哥伦比亚大学新闻学院—计算新闻学

-《走进香港大学新闻学院–数据新闻

– 《斯坦福纪录片 -数据时代的新闻学

资料附录:

书籍类:

– Interactive Data Visualization for the Web

– Eloquent JavaScript

教程类:

– Line Chart in D3

– D3 for Mere Mortals

– Thinking with joins

– How selections work

具体例子:

– D3 Bar Chart

– D3 Line Chart

– D3 Multi Series Line Chart

– Population Pyramids (参考了键盘控制功能)

– Interactive Line Graph

– Horizon Chart (对,我们还做出过horizon chart的版本)

其他:

– Mr. Data Converter

 

236月/150

数据论水浒:解析108名梁山好汉

发布在 邵珠庆

梁山一百单八将都是如何落草为寇的?他们都是什么”学历”?除了大碗喝酒大块吃肉,他们真的是替天行道吗?

落草的成了”好汉”,入仕的成了”奸佞”,这之间有一个什么样的衡量标准?

他们,为什么上梁山?

纵观梁山一百单八将,他们上山的原因,大致可以分为以下五种。

第一种:被自己人陷害–以卢俊义为代表。

这里的”自己人”是指一百单八将里的人,如杨志被晁盖、吴用等劫了生辰纲。虽然那时杨志还没走上革命道路,但是日后却在一起了,所以也算是被自己人陷害的。

这种人里,有卢俊义、秦明、李应、朱仝、杨志、徐宁、燕青、萧让、安道全、金大坚、杜兴、李云,共十二人,其中天罡有七人,地煞有五人。

需要说明的是燕青。燕青是跟随主人一起的,若主人不被陷害,他还会在卢俊义府上做他的高级白领。

第二种:被官府(或者与官府有勾结的人)陷害,被迫上山–以林冲为代表。

这些人里,有宋江、林冲、花荣、柴进、鲁智深、武松、戴宗、解珍、解宝、朱武、裴宣、欧鹏、陈达、杨春、宋清、施恩,共十六人,其中天罡九人,地煞七人。可以从一定层次上直接代表着官逼民反的人数。

说明一下,朱武、陈达、杨春是否有这么悲惨,不得而知,原著只交代了他们三人”累被官司逼迫,不得已上山落草”。那么我们就姑且认为他们是被官府逼的吧。宋清是宋江的弟弟,自然跟他哥一样。鲁智深倒不是因为杀了人而上山,他是因为救了林冲被官府通缉才落草的。

第三种:被俘上山,由于个人意志、信仰不坚定,甘愿为梁山效力–以关胜为代表。

这些人里,有关胜、呼延灼、董平、张清、索超、宣赞、郝思文、韩滔、彭玘、单廷珪、魏定国、凌振、扈三娘、龚旺、丁得孙、蔡福、蔡庆、郁保四,共十八人,其中天罡五人,地煞十三人。

有些人可能会对蔡福、蔡庆有异议。实际上在攻打大名府的时候,他俩已经被软禁了,和被俘又有何区别?值得注意的是,梁山军此时正在大名府烧杀抢掠,还是蔡福说了句”大官人可救一城百姓,休教残害”。等传下令时,”城中将及伤损一半”。从这话可以看出梁山军的一贯作风。可惜兄弟俩只有蔡庆活到了”解放后”(平了方腊)。

郁保四是作为人质和曾生一起上梁山谈判的,实际上也是俘虏的一种。

第四种:因杀人越货触犯了法律,为逃避法律制裁不得已而上山–以晁盖、吴用等人为代表。

晁盖、吴用、公孙胜等人在劫了生辰纲之后,是因为东窗事发,不得已才上山的。若不是白胜拿着分到的银子去赌博不小心露了馅儿,他们一时半会还是不会上山的。

这批人里,有吴用、公孙胜、刘唐、李逵、史进、穆弘、雷横、李俊、阮小二、张横、阮小五、张顺、阮小七、杨雄、石秀、黄信、孙立、燕顺、吕方、郭盛、王英、孔明、孔亮、童威、童猛、孟康、侯健、乐和、穆春、杜迁、薛永、朱富、李立、石勇、孙新、顾大嫂、白胜,共三十七人。其中,天罡十五人,地煞二十二人。

有一些革命同志,如李逵等,也不是主动要上山的。虽然说上山可以大碗喝酒大块吃肉大肆砍人,不过他那时还是一个小小的国家干部,还当着小牢子,虽然无赖,但还不至于把脑袋别在裤腰带上干造反工作。只有劫法场救了宋江、戴宗之后,他才真正犯下不赦之罪,只好上山了。

第五种:无明显上山理由。

比如向往梁山大碗喝酒痛快–这和当年很多青年参加红军的道理是一样的;还有一些人,原著中没有交代,一出场即是土匪。我以为,这一批人天生革命觉悟极高,为造反而生,以造反为乐。

这批人里,有邓飞、杨林、蒋敬、皇甫端、鲍旭、樊瑞、项充、李衮、马麟、郑天寿、陶宗旺、曹正、宋万、李忠、周通、汤隆、邹渊、邹润、朱贵、焦挺、张青、孙二娘、王定六、时迁、段景住,共二十五人。没有一个天罡,全是地煞。

梁山革命根据地的两个创始人杜迁、宋万为何不在一起?因为杜迁和王伦是受了”鸟气”来到梁山落草的,而宋万后来才到。所以杜迁是个人原因,而宋万没有交代,只好”革命觉悟高”了。

上述五种原因如果列成表的话,将会更直观:

一、各种革命类型的数量、百分比分布

数据论水浒

数据论水浒

二、各种革命类型,在天罡、地煞中的分布

水浒论水浒

根据上图,我们可以得出什么结论?

一、在总人数中,由于自身触犯法律,为了逃避大宋法律制裁而投奔梁山的人数最多。这些人,在天罡中占据主导地位,在地煞中也高据第二。

那么我们基本上可以认定,这些人,大部分都是无事生非、九处响锣十处有他的那种人。他们的活跃度很高,唯恐天下不乱,而个人能力又很强。这些人,占据了天罡数的42%。

这批人为何在天罡中有如此之多的票数?主要是劫生辰纲,产生了六个天罡,劫法场救宋江,又产生了五个天罡,所以,票数很多。

二、天罡星中,革命觉悟都很低,没有一个是主动上山的。在天罡星中,人群从高到低依次是:由于自身原因上山的、被官府陷害被迫上山的、被自己人陷害上山的,最后是被俘上山的。

由于革命意志不是很坚定,所以,梁山集团最后的被招安,也是不可避免的了。

三、地煞星的革命觉悟最高,很多人在梁山还没有发展壮大的情况下,已经有了自己的一片革命根据地。但也正是由于大伙的文化程度不高,光有热情没有能力是不够的,所以避免不了最后被梁山吞并的结局。同时大伙能力普遍不是很高,只好排到地煞星去了。低天罡星一等啊!

四、 被自己人陷害的一类中,天罡星的比例明显比地煞星要高。这是由于天罡星中的多是能厮杀的人,他们对正处于成长阶段的梁山集团来说是多多益善。

五、总体来看,真正”官逼民反”的,只占总数的15%。这在一定程度上证明了大家一直认为的”官逼民反”是成立的,但我们还应该看到,其中的绝大多数人,要么是无事生非之辈,要么是杀人越货之徒,再就是被俘的原大宋公务员,他们并非都是官逼民反。像王英之流,”原是车家出身。为因半路里见财起意,就势劫了客人。事发到官,越狱走了”,这是死活都和革命沾不上边的。

总结了这么多,实际上结论只有一条,在《水浒传》里,只有造反才是那些人最好的选择。如果不造反,大部分的革命同志只能死于非命,而造反是一项投入产出比小、风险大收益小的特殊工种,除了头几年有把脑袋别在裤腰带上的危险之外,之后还有两条路可以走:

A. 招安;

B. 自己打出一片天地,当了开国元勋。

施老爷子没把他们的造反写成功,估计也是知道哪怕就算是成功,最后也免不了来一个”杯酒释兵权”吧。这还算是文明的,要是学朱元璋同学最后大肆屠杀功臣,那就更完蛋了。

数据论水浒

附梁山一百单八将落草原因

1. 宋 江:利用职权,私放晁盖;与梁山勾结,被二奶阎婆惜发觉;不甘被敲诈,杀了二奶;事发后被捉拿归案,刺配江州;题反诗被黄文炳识破,判处死刑;后被梁山好汉救出,上山落草。

2. 卢俊义:因名头太大,被宋江看中欲赚之上山;遂被吴用诬造反,并怂恿其家人出首告发;获罪被判刺配沙门岛,李固和贾氏贿赂董超、薛霸欲在路上将其杀害,被燕青救出;奔赴梁山途中再次落入官兵之手,梁山好汉打破大名府将其救出,上山落草。

3. 吴 用:劫生辰纲事发,上山落草。

4. 公孙胜:劫生辰纲事发,上山落草。

5. 关 胜:被呼延灼设计引入埋伏圈,被俘,上山落草。

6. 林 冲:被高俅害得家破人亡,无家可归,经柴进介绍,上山落草。

7. 秦 明:被花荣用计生俘,灌醉后宋江派小卒假扮他攻打青州,害其一家老小被慕容知府杀害;最后无处可去,上山落草。

8. 呼延灼:攻打梁山泊被徐宁破了连环马,不得已去青州借兵,又被三山聚义好汉戏弄;后被宋江生俘,上山落草。

9. 花 荣:原为清风寨武知寨(副职),本与刘高文知寨(正职)有隙,为解救宋江,与刘高彻底决裂,又被黄信生俘;解送途中被清风山燕顺、王英、郑天寿救出;后生俘秦明,又通过秦明说服黄信,三人一同上山落草。

10. 柴 进:未上山之前,已与梁山有私交;后因殷天锡(高俅叔伯兄弟、高唐州知府高廉老婆的兄弟)强占其叔父柴皇城花园,与李逵一起前与高唐州看望;殷天锡作威作福,李逵怒从胆边生,杀了殷天锡并逃回梁山;柴进被控指使李逵打死殷天锡,被打入死囚牢,柴皇城家产被抄;李逵从梁山搬救兵救出柴进,柴进上山落草。

11. 李 应:三打祝家庄时被萧让、戴宗等假扮官人捉拿,押解途中被林冲等人”解救”上山;吴用派人将李家庄烧成白地,并取其家眷;后路被断,只得上山落草。

12. 朱 仝:未上山之前,与梁山已有往来;后因私放雷横,刺配沧州,每日陪小衙内玩耍,被吴用、雷横、李逵等用计杀了小衙内,不得已只好上山。

13. 鲁智深:因救林冲恶了高俅,被迫远走江湖;被张青、孙二娘麻翻,介绍投奔二龙山;原二龙山头领邓龙不接纳,与杨志、曹正设计占了二龙山宝珠寺,上山落草。

14. 武 松:因杀死潘金莲等被刺配孟州;替施恩做打手得罪了蒋门神,蒋门神买通张都监诬陷武松做贼,将其刺配恩州;路上张都监、蒋门神派人欲结果武松性命,反被武松大闹飞云浦,血溅鸳鸯楼;事发后,经孙二娘、张青介绍上二龙山落草。

15. 董 平:原为东平府兵马都监,因求婚一事与太守程万里不和;后被宋江用计生俘,为梁山所用;以其原有身份,赚开东平府城门,杀程太守抢其女,从此上山落草。

16. 张 清:原为东昌府猛将,打东昌府时被林冲赶下水,被三阮生俘,上山落草。

17. 杨 志:三代将门之后,因丢失花石纲逃往他处避难,后被赦;欲行贿高俅求官复原职,高俅(及下人)收了钱不办事;杨志穷困潦倒,草市卖刀不料误杀牛二,被刺配大名府;因与索超比武被梁中书赏识,做了管军提辖使;替梁中书押送生辰纲被劫,不得已与鲁智深一同用计夺了二龙山宝珠寺落草。

18. 徐 宁:本是随驾金枪班教师,懂得使钩镰枪;不幸被时迁盗了家传宝甲,后被其表弟汤隆等用计赚上山落草。

19. 索 超:宋江攻打大名府时被俘,上山落草。

20. 戴 宗:欲用假信救宋江,被黄文炳识破,同罪判处死刑;后被梁山好汉救出,上山落草。

21. 刘 唐:劫生辰纲事发,上山落草。

22. 李 逵:劫法场救宋江后,上山落草。

23. 史 进:本与少华山勾结,事发后杀死俩都头并李吉,不愿意落草而去投奔王进;寻王进不得结识鲁智深,因鲁智深拳打镇关西而离开渭州;后至延州、北京,盘缠用尽,与鲁智深一起火烧瓦罐寺后分手,投少华山落草。

24. 穆 弘:劫法场救宋江后,上山落草。

25. 雷 横:本与梁山勾结;因打了白玉乔,被知县姘头告了一状,戴枷示众;后因白秀英与其母亲厮打,用枷打死白秀英;被朱仝私放,上山落草。

26. 李 俊:劫法场救宋江后,上山落草。

27. 阮小二:劫生辰纲事发,上山落草。

28. 张 横:劫法场救宋江后,上山落草。

29. 阮小五:劫生辰纲事发,上山落草。

30. 张 顺:劫法场救宋江后,上山落草。

31. 阮小七:劫生辰纲事发,上山落草。

32. 杨 雄:杀了与和尚裴如海私通的老婆潘巧云,投奔梁山落草。

33. 石 秀:杀了与杨雄老婆潘巧云勾搭的头陀和报晓和尚,与杨雄一起杀了潘巧云,无处可去,投奔梁山落草。

34. 解 珍:因官府下令限期捉拿大虫,打死老虎后被毛太公诬陷入狱;毛太公勾结王正、包吉等欲结果其性命,得乐和等救出,杀了毛太公一家老小,投奔梁山落草。

35. 解 宝:同解珍。

36. 燕 青:被李固赶出家门,因救卢俊义杀了董超薛霸;投奔梁山途中,卢俊义被官兵劫走,遂上梁山搬救兵,救出卢俊义后一同上山落草。

37. 朱 武:”累被官司逼迫,不得已上山落草”。

38. 黄 信:为救宋江,打破清风寨,一同上山落草。

39. 孙 立:为劫狱救解氏兄弟,上山落草。

40. 宣 赞:被秦明生擒,上山落草。

41. 郝思文:被扈三娘生擒,上山落草。

42. 韩 滔:被刘唐、杜迁生擒,上山落草。

43. 彭 玘:被扈三娘生擒,上山落草。

44. 单廷珪:被关胜生擒,上山落草。

45. 魏定国:被围,向关胜投降,上山落草。

46. 萧 让:梁山欲救宋江,被戴宗赚上梁山落草。

47. 裴 宣:”为因朝廷除将一员贪滥知府到来,把他寻事,刺配沙门岛。”路过饮马川被救上山落草。

48. 欧 鹏: “因恶了本官,逃走在江湖上。”原著中未交代为何落草,出场即为黄门山头领。

49. 邓 飞:原著并未交代,开场即为饮马川头领。

50. 燕 顺:原是贩羊马客人出身,因为消折了本钱,占据清风山落草。

51. 杨 林:原本也是绿林中人,后遇公孙胜,被举荐上梁山。

52. 凌 振:攻打梁山时落水被生俘,上山落草。

53. 蒋 敬:原著未交代,只说:”原是落科举子出身。科举不弟,弃文就武。颇有谋略,精通书算,积万累千,纤毫不差。亦能刺枪使棒,布阵排兵。”

54. 吕 方:”因贩生药到山东,消折了本钱,不能够还乡”,占对影山落草,后上梁山。

55. 郭 盛:”因贩水银货卖,黄河里遭风翻了船,回乡不得”,占对影山落草,后上梁山。

56. 安道全:被张顺杀死姘头并题”杀人者安道全也”,被迫上山落草。

57. 皇甫端:被张清举荐,上山落草。

58. 王 英:”原是车家出身。为因半路里见财起意,就势劫了客人。事发到官,越狱走了”,上清风山落草。

59. 扈三娘:二打祝家时被林冲生擒上山,被宋太公认为义女,上山落草。

60. 鲍 旭:原著未交代,原为枯树山头领,被李逵说服上梁山落草。

61. 樊 瑞:原著未交代,原为芒砀山头领,后被项充、李衮说服,一同上梁山。

62. 孔 明:因与本村财主争执而杀其全家,逃上白虎山落草。

63. 孔 亮:同孔明。

64. 项 充:原著未交代,原为芒砀头领,后被俘虏,留在梁山。

65. 李 衮:同项充。

66. 金大坚:梁山欲救宋江,被戴宗赚上梁山落草。

67. 马 麟:原著未交代,只说”原是小番子闲汉出身,吹得双铁笛,使得好大滚刀,百十人近他不得”。

68. 童 威:劫法场救宋江后,上山落草。

69. 童 猛:劫法场救宋江后,上山落草。

70. 孟 康:”原因押送花石纲,要造大舡,嗔怪这提调官催并责罚他,把本官一时杀了,弃家逃走在江湖上。”

71. 候 健:提供捉拿黄文炳线索,为宋江出气,后一同上山落草。

72. 陈 达:”累被官司逼迫,不得已上山落草”。

73. 杨 春:也是”累被官司逼迫,不得已上山落草”。

74. 郑天寿:路过清风山时与王英斗五六十回合不分胜负,被燕顺请上山落草。

75. 陶宗旺:原著未交代,只说”庄家田户出身。惯使一把铁锹,有的是气力,亦能使枪轮刀”。

76. 宋 清:与宋太公一起被同取上山落草。

77. 乐 和:为劫狱救解氏兄弟,上山落草。

78. 龚 旺:梁山打东昌府时被林冲、花荣生俘,上山落草。

79. 丁得孙:梁山打东昌府时被燕青打中马蹄,被吕方、郭盛生擒,上山落草。

80. 穆 春:劫法场救宋江后,上山落草。

81. 曹 正:”为因本处一个财主,将五千贯钱教小人来此山东做客,不想折本,回乡不得”,后助鲁智深打破二龙山,一并上山落草。

82. 宋 万:原著未交代,开场即为梁山泊头领。

83. 杜 迁:”因鸟气合着杜迁来这里落草。”

84. 薛 永:劫法场救宋江后,上山落草。

85. 施 恩:”因武松杀了张都监一家人口,官司着落他家追捉凶身,以此连夜拿家逃走在江湖上。”后投二龙山入伙。

86. 李 忠:与鲁智深在渭州分手之后,经过桃花山,被周通劫道;杀退周通,被请上桃花山落草。

87. 周 通:原著未交代,出场即为桃花山原主人,后投梁山。

88. 汤 隆:流落江湖,遇李逵,跟随上山落草。

89. 杜 兴:”因一口气上打死了同伙的客人,吃官司监在蓟州府里。杨雄见他说起拳棒都省得,一力维持,救了他。”后在李应家落草,”每日拨万论千”,后随李应上山落草。

90. 邹 渊:开场即为登云山头领,与邓飞、杨林、石勇为旧识,后救解氏弟兄一起上梁山。

91. 邹 润:开场即为登云山头领。

92. 朱 贵:”因在江湖上做客,消折了本钱,就于梁山泊落草。”

93. 朱 富:与哥哥朱贵一起,为救李逵麻翻师傅李云,后劝说李云与他一起上山落草。

94. 蔡 福:宋江攻破大名府,因照顾卢俊义有功,被硬请上山落草。

95. 蔡 庆:宋江攻破大名府,因照顾卢俊义有功,被硬请上山落草。

96. 李 立:原开黑店,因闹江州救宋江而上山落草。

97. 李 云:因押解李逵,被朱富麻倒,无法交差,只好上山落草。

98. 焦 挺:”平生最无面目(不顾面子,不讲交情),到处投人不着”,被李逵劝上梁山落草。

99. 石 勇:”为因赌博上一拳打死了个人,逃走在柴大官人庄上。”送信给宋江,一同上山。

100. 孙 新:为劫狱救解氏兄弟,上山落草。

101. 顾大嫂:为劫狱救解氏兄弟,上山落草。

102. 张 青:原在孟州道上开黑店,后投奔二龙山落草。

103. 孙二娘:原在孟州道上开黑店,后投奔二龙山落草。

104. 王定六:随张顺在取安道全时一同上山落草。

105. 郁保四:原为曾头市人马,随曾生一同上梁山谈判,被说服落草。

106. 白 胜:劫生辰纲事发被捉拿,后被解救,上山落草。

107. 时 迁:”流落在此,则一地里做些飞檐走壁,跳篱骗马的勾当。曾在苏州府里吃官司,却得杨雄救了他。”听说石秀、杨雄欲上梁山,便一同跟去上山落草。

108. 段景住:以盗马为生,欲盗好马送给宋江作见面礼,因被劫了马而直接投奔梁山。

摘自《盗寇的潜规则:从数据看水浒》一书。

1612月/140

JS 循环遍历JSON数据 简单

发布在 邵珠庆

JSON数据如:{"options":"[{/"text/":/"王家湾/",/"value/":/"9/"},{/"text/":/"李家湾/",/"value/":/"10/"},{/"text/":/"邵家湾/",/"value/":/"13/"}]"}

用js可以写成:

[javascript] view plaincopyprint?
 
var data=[{name:"a",age:12},{name:"b",age:11},{name:"c",age:13},{name:"d",age:14}];
for(var o in data){
    alert(o);
    alert(data[o]);
    alert("text:"+data[o].name+" value:"+data[o].age );
}

或是

[javascript] view plaincopyprint?

<script type="text/javascript">
function text(){
  var json = {"options":"[{/"text/":/"王家湾/",/"value/":/"9/"},{/"text/":/"李家湾/",/"value/":/"10/"},{/"text/":/"邵家湾/",/"value/":/"13/"}]"} 
  json = eval(json.options)
  for(var i=0; i<json.length; i++)
  {
     alert(json[i].text+" " + json[i].value)
  }
}
</script>

 

 

 

67月/130

天猫淘宝公开课:卖家数据分析全攻略

发布在 邵珠庆

几乎每个淘宝运营一提到数据营销,基本上都能说上来这些软件:量子恒道、淘宝指数、数据魔方。但是谈及具体应用方面,到底要关注哪些指标,有了这些指标后要怎么优化,自己的店铺正处于什么阶段,有什么问题,接下来要怎么改变……很多卖家就犯难了。

古有云,知己知彼,百战不殆。数据分析其实也就是在做这两件事。知己就是要对自己的店铺状况了如指掌,而知彼则要对大环境和直接竞争对手有清晰的认识。

【知己篇】店内数据分析

店内运营如果简单来看,就是流量和转化这两件事。所以分析也主要从这两个指标出发。因为流量结构和精度直接影响转化,转化好坏再反过来影响流量,所以在分析时,先做流量盘查,再做转化分析。

一、 流量

1、 搜索流量

工具:搜索诊断助手、直通车

a基础条件:不违规,可在“卖家工作台”-“搜索诊断助手”-“宝贝诊断里”检查。

b相关性:类目属性相关性、标题关键字相关性。

C人气分:是否橱窗推荐、是否加入消保、DSR评分、支付宝使用率、旺旺效应速度、拍货与发货的时差。

D图片:很多卖家在优化主搜流量时,经常会忽略图片的优化,然而图片点击率的差距,直接影响了最后的搜索流量。买家不是直接搜索进来的,而是被图片吸引进来的,优化图片就显得非常重要。建议可以用直通车来测试图片(方法下文会介绍到)。

E价格与销量:销量相当的产品,价格高的有更多展示的机会;价格相同的产品,销量高的有更多展示机会。而检查该项指标主要检查自己与直接竞争对手的差距,尤其是7天销量的差距,以做调整。

F标题优化:在销量相对低的时候多使用长尾词,销量高的时候多使用泛词、中心词,并反复测试,得出搜索流量×搜索转化率的最大值。

2、 付费流量

工具:各付费工具的数据报表、量子。

a直通车:诊断直通车主要看点击率和转化率这两个指标。

点击率直接影响淘宝直通车的收入,在行业利润如此透明的年代,每家的出价其实都不可能差很多,而点击率越高,直通车本身的收入就越高,就会提供更好的位置给你。

查看工具:行业解析报表。

优化办法:挖掘USP。

转化率则是淘宝看重的用户体验,直通车转化率要做到约等于或略低于该宝贝整体转化率才算比较健康。

查看工具:直通车转化报表、量子-销售分析-宝贝销售排行;

优化办法:在销量较低的时候重点优化长尾词,销量高时优化泛词和定向。

b钻石展位:诊断钻展其实也和直通车原理基本一致。也是优化图片,然后选择精准的店铺来定向。

查看工具:钻展广告位对应类目数据、钻展定向报表-手工统计各项回报率;

优化办法:总结同行优秀素材的构成因素和失败素材的特点、把收集店铺ID的维度做细。

C淘客:淘客诊断只要看自己与竞争对手的销量和佣金有何差距即可。

二、 内功

1、 转化率

工具:量子、数据魔方

a、 内页:首先看销量,其次看评价质量,再来看单品转化率、页面停留时间和询单率。如果连基础销量都没有,评价很差,转化率是不可能好的。两个先决条件解决了,再看单品转化率、页面停留时间和询单率是否不低于行业均值(或店内卖的好的宝贝)。若低于,则一一优化USP卖点、逻辑顺序(是否都做到围绕USP)、展现内容多样化(数据、图表、细节图、权威认证报告、大量实证、视频等)、展现方式(字体、字号、背景色、配色)。

b、 访问深度:由于80%的顾客入店都是从内页进来,所以主要优化内页可导流的位置,分别为店招、宝贝页关联、宝贝页侧边栏、店尾进行优化。再优化首页。

查看工具:量子-销售分析-销售总览-平均访问深度、量子-流量分析-宝贝被访排行、量子-流量分析-首页被访数据(停留时间、点击率、跳失率)、量子-店铺装修。

优化办法:将店内20%的产品用导航、促销、关联等的方式做集中展示。

c、 支付率:是否做到了80%以上。

查看工具:量子-销售分析-销售总览。

优化办法:利用短电旺给顾客一个必须现在下单的理由。

d、 营销活动:定期举办营销活动可提升转化率。

e、 客服询单转化率:是否至少做到了行业均值。

查看工具:如赤兔等第三方工具。

优化方法:顾客的每一个问题都建立标准答案。

2、 客单价

工具:量子-销售分析-销售总览。

优化办法:包邮条件、满减满赠、爆款关联、客服推荐、SKU扩充、促销产品等。

3、 DSR

工具:淘宝DSR评分计算器。

优化办法:a、淘宝原有服务的升级(7天无理由升级为30天、3天发货升级为24小时发货等);b、淘宝未有服务的创新(围绕客户与商家接触点的创新,如SNS、游戏)。

4、 CRM

CRM主要查看老客户占比、老客户转化率、二次购买率、客户分组短彩邮的ROI。

工具:卖家工作台-会员关系管理、数云、客道等第三方软件。

优化的办法:建立老客户分组,根据分组创建老客户的不同特权。越高级的客户拥有越高级的特权。

【知彼篇】竞争数据分析

竞争数据主要包括整个市场数据和直接竞争对手数据。市场数据的获取能够判定市场容量、市场竞争的激烈程度,避免新产品在还未上市时就输了。直接竞争对手的数据能则能取长补短。

一、市场数据

1、市场容量

用数据魔方-行业分析-整体情况可以看到整个行业、子类目的市场容量。

2、 搜索指数

用淘宝指数查看搜索指数和成交指数

3、 细分数据

工具:淘宝指数和数据魔方

a、 买家购买分析

用数据魔方-行业分析看到买家的购买分析,可查看购买的单价和客单价及购买的频次。

b、 买家信息分析

用数据魔方-行业分析看到买家的信息分析,可查看买家的来访高峰时段、购买高峰时段、买家地域、性别分布和年龄。

c、 属性热销

用数据魔方-属性分析-属性热销排行,查看买家需求的产品属性。

4、 趋势

工具:数据魔方

a、 市场趋势

用数据魔方-行业分析-整体情况拉出最近3年、1年、半年和一季度的走势。

b、 行业关键词热搜飙升榜(数据魔方-淘词-行业热词榜-行业关键词热搜飙升榜)

5、 竞争度

用数据魔方-行业分析-卖家分析,查看卖家的数量,值越大,竞争越激励。再用核心关键词在淘宝上搜索,按销量排序,看前3名,第3和第40名的销售笔数的差额,值越低,竞争越激烈。

6、 空白市场

需要细心的留意,并对整个行业的动态有清晰的掌握。

二、 竞争对手数据

竞争对手的数据建议是每周都收集,然后和自己店内数据进行对比。

1、 销售额

用数据魔方-品牌分析-品牌详情来查询

2、 转化率

用数据魔方-品牌分析-品牌详情来查询

3、 客单价

用数据魔方-品牌分析-品牌详情来查询

4、 营销活动

定期收集竞争对手的营销活动,包括活动商品品类、商品价格、活动政策、互动平台和媒介投放等。

5、 爆款

定期收集竞争对手的主要爆款,包括产品名、价格、转化率、销量、单品活动、单品卖点、关联、流量来源、直通车卡位、直通车图片、钻展图片、老客户优惠等。查看工具:数据魔方-品牌分析-品牌详情-热销宝贝排行、手工收集。

6、特色

对竞争对手的赠品、包裹、优惠券、客户互动等相关信息进行收集。

数据分析说到底就是和自己的过去比,和竞争对手的现在比,和我们期望的未来比。找出现在店铺存在的问题,再思考可以用什么方法来改善它,这样的数据分析才有意义。

216月/130

Mysql 导入CSV数据

发布在 邵珠庆

MYSQL   LOAD DATA INFILE命令可以把csv平面文件中的数据导入到数据库中。

linux下:

  1. LOAD DATA INFILE '/home/test/dump/ip_location.csv'
  2.  INTO TABLE ip_location
  3.  CHARACTER SET utf8
  4.  FIELDS TERMINATED BY ',' ENCLOSED BY '"';
--CHARACTER SET :mysql字符集,一定要加上,免去乱码麻烦
--INTO TABLE :导入到哪个表
--FIELDS TERMINATED BY :以什么作为分割符
-- ENCLOSED BY :被什么包围



windows:

  1. LOAD DATA INFILE "d:/insert_data.csv"
  2.  REPLACE INTO TABLE DEMO
  3.  CHARACTER SET gb2312
  4.  FIELDS TERMINATED BY "," ENCLOSED BY ""
  5.  LINES TERMINATED BY "\r\n";
--LINES TERMINATED BY:这个与linux不同,以什么作为一行的结尾。
   下一页