- 浏览: 341893 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
lovebegar:
很有价值,之前自己写都是第一种,学习了~
Oracle 多行合并一行 方法 -
zuodang:
我尝试在windows中搭环境编译 curl-java-mas ...
有强大的cURL,忘掉httpclient的吧! -
buildhappy:
同求http://www.gknw.de/mirror/cur ...
有强大的cURL,忘掉httpclient的吧! -
zgf_091:
好早的文章,现在才看到,就是这个链接http://www.gk ...
有强大的cURL,忘掉httpclient的吧! -
huchuhan:
LZ应该贴个例子出来, 网上这方面的东西太少了.
有强大的cURL,忘掉httpclient的吧!
将geoip,geoip_city数据导入Postgresql数据库
MaxMind公司提供的geoip数据格式有两种,一种是二进制文件,一种是csv文件,可能还有其他格式的,比如dotted octet format。本次总结只以csv文件举例。
1.从MaxMind得到csv文件,这个需要付费的。
2.然后将得到的文件解压缩到服务器特定目录。
3.安装PostgresSQL数据库,并且安装ip4r
(可以从网上下载postgresql-distrib-ip4r包安装)
4.安装python以及Psycopg2
1)yum list "*psycopg*"
2)或者直接用wget ftp://ftp.muug.mb.ca/mirror/fedora/epel/5/i386/python-psycopg2-2.0.7-1.el5.i386.rpm得到
3)rpm -Uvh psycopg2-2.0.7-1.el5.i386.rpm
5. 准备python导入脚本文件
注意:
1.该文件中创建索引使用的WITH选项是PostgresSQL 8.2以上版本才支持的。
2.我添加了数据库密码验证,要不数据库密码验证通不过。
6: 创建表
7: 使用脚本命令导入
8. 如果是更新的话,要考虑slony集群环境,先用slonik在主数据库服务器上把表清空,然后再导入新的数据。
参考文章:http://www.siafoo.net/article/53
1.从MaxMind得到csv文件,这个需要付费的。
2.然后将得到的文件解压缩到服务器特定目录。
3.安装PostgresSQL数据库,并且安装ip4r
(可以从网上下载postgresql-distrib-ip4r包安装)
4.安装python以及Psycopg2
1)yum list "*psycopg*"
2)或者直接用wget ftp://ftp.muug.mb.ca/mirror/fedora/epel/5/i386/python-psycopg2-2.0.7-1.el5.i386.rpm得到
3)rpm -Uvh psycopg2-2.0.7-1.el5.i386.rpm
5. 准备python导入脚本文件
''' Script for loading GeoIP CSV data into a postgresql database ''' import logging, psycopg2, psycopg2.extensions, sys from optparse import OptionGroup, OptionParser from StringIO import StringIO class GeoIPDataLoader(object): def __init__(self, dsn, blocks='GeoLiteCity-Blocks.csv', locations='GeoLiteCity-Location.csv', schema='public'): self.con = psycopg2.connect(dsn) # We don't need transactions... right? self.con.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT) # The data is in ISO8859_15 encoding self.con.set_client_encoding('iso8859_15') self.cur = self.con.cursor() self.blocks_csv = blocks self.location_csv = locations self.schema = schema def close(self): self.con.close() def create_tables(self): print 'Creating structure...', self.db_execute( ''' CREATE TABLE locations ( id bigint NOT NULL, country character(2) NOT NULL, region character(2), city character varying(75), postal_code character varying(15), latitude numeric(6,4) NOT NULL, longitude numeric(7,4), metro_code integer, area_code integer, CONSTRAINT locations_pkey PRIMARY KEY (id) ); CREATE TABLE blocks ( start_ip bigint NOT NULL, end_ip bigint NOT NULL, location_id bigint NOT NULL ); ''' ) print '\033[1;32mDone\033[1;m' def create_indexes(self, ip4=False): print 'Adding Indexes...', sys.stdout.flush() if not ip4: self.db_execute(''' CREATE INDEX ix_start_end_ip ON blocks USING btree (start_ip, end_ip) WITH (FILLFACTOR=100); CREATE INDEX ix_end_start_ip ON blocks USING btree (end_ip, start_ip) WITH (FILLFACTOR=100); ''') else: self.db_execute(''' CREATE INDEX ix_ip_range ON blocks USING gist (ip_range) WITH (FILLFACTOR=100); ''') print '\033[1;32mDone\033[1;m' def create_functions(self, ip4=False): print 'Adding utility functions...', sys.stdout.flush() if ip4: self.db_execute(''' CREATE OR REPLACE FUNCTION get_location(inet) RETURNS bigint AS $$ SELECT location_id FROM %s.blocks WHERE ip_range >>= ip4($1) $$ LANGUAGE SQL; ''' % self.schema) else: self.db_execute(''' CREATE OR REPLACE FUNCTION inet_to_bigint(inet) RETURNS bigint AS $$ SELECT $1 - inet '0.0.0.0' $$ LANGUAGE SQL; ''' % self.schema) print '\033[1;32mDone\033[1;m' def create_schema(self): try: self.db_execute('''CREATE SCHEMA %s;''' % self.schema) except psycopg2.ProgrammingError: pass self.db_execute('SET search_path TO %s,public;' % self.schema) def db_execute(self, ddl): self.cur.execute(ddl) # self.con.commit() def load_data(self): # Load Locations self.load_table(self.location_csv, 'locations') # Load Blocks self.load_table(self.blocks_csv, 'blocks') def load_table(self, file_name, table_name): print 'Loading table \033[1;34m%s\033[1;m from file \033[1;34m%s\033[1;m...' % (table_name, file_name), sys.stdout.flush() geo_file = open(file_name) # Skip the copyright header geo_file.readline() geo_file.readline() #Remove quotes... psycopg2's `copy` errors on them string_data = geo_file.read().replace('"', '') self.cur.copy_from(StringIO(string_data), table_name, sep=',', null='') print '\033[1;32mDone\033[1;m' def migrate_to_ip4(self): print 'Adding ip_range column' self.db_execute(''' ALTER TABLE blocks ADD COLUMN ip_range ip4r; ALTER TABLE blocks ALTER COLUMN ip_range SET STORAGE PLAIN; ''') print 'Migrating data to ip4...', sys.stdout.flush() self.db_execute('''UPDATE blocks SET ip_range = ip4r(start_ip::ip4, end_ip::ip4)''') print '\033[1;32mDone\033[1;m' print 'Dropping unneeded columns' self.db_execute(''' ALTER TABLE blocks DROP COLUMN start_ip; ALTER TABLE blocks DROP COLUMN end_ip; ''') def vacuum(self): print 'Vaccuming database...', sys.stdout.flush() self.db_execute('VACUUM FULL ANALYZE') print '\033[1;32mDone\033[1;m' def main(): DSN = "dbname='%s' user='%s' host='%s'" parser = OptionParser() # Operational options parser.add_option('-c', '--load-ddl', dest='load_ddl', default=False, action='store_true', help='Create database structure') parser.add_option('-g', '--load-data', dest='load', default=False, action='store_true', help='Load the GeoIP data') parser.add_option('-b', '--blocks-file', dest='blocks_csv', default='GeoLiteCity-Blocks.csv', action='store', help='GeoIP Blocks CSV file [default: %default]', metavar='BLOCKS_FILE') parser.add_option('-l', '--locations-file', dest='locations_csv', default='GeoLiteCity-Location.csv', action='store', help='GoeIP Locations CSV file [default: %default]', metavar='LOCATIONS_FILE') db_group = OptionGroup(parser, 'Database Options') # Database options db_group.add_option('-H', '--host', dest='db_host', default='localhost', action='store', help='Database host [default: %default]', metavar='DB_HOST') db_group.add_option('-d', '--database', dest='db_name', default='geoip_db', action='store', help='Database name [default: %default]', metavar='DATABASE_NAME') db_group.add_option('-U', '--user', dest='db_user', default='geoip', action='store', help='User [default: %default]', metavar='USER_NAME') db_group.add_option('-W','--prompt',dest='password',default='', action='store',help='Password',metavar='PASSWORD') db_group.add_option('-s', '--schema', dest='schema', default='public', action='store', help='Database Schema [default: %default]', metavar='SCHEMA') db_group.add_option('--ip4r', dest='ip4', default=False, action='store_true', help='Use IP4r module [default: %default]') parser.add_option_group(db_group) (options, args) = parser.parse_args() data_loader = GeoIPDataLoader("dbname='%s' user='%s' password='%s' host='%s'" % (options.db_name, options.db_user,options.password, options.db_host), blocks=options.blocks_csv, locations=options.locations_csv, schema=options.schema) if not options.load_ddl and not options.load: parser.print_help() return if options.load_ddl: if options.schema != 'public': data_loader.create_schema() data_loader.create_tables() if options.load: data_loader.load_data() if options.ip4: data_loader.migrate_to_ip4() if options.load: data_loader.create_indexes(options.ip4 is True) if options.load_ddl: data_loader.create_functions(options.ip4 is True) data_loader.vacuum() if __name__ == "__main__": main()
注意:
1.该文件中创建索引使用的WITH选项是PostgresSQL 8.2以上版本才支持的。
2.我添加了数据库密码验证,要不数据库密码验证通不过。
6: 创建表
--DROP TABLE locations; --DROP TABLE blocks; -- Table DDL CREATE TABLE locations ( id bigint NOT NULL, country character(2) NOT NULL, region character(2), city character varying(75), postal_code character varying(15), latitude numeric(6,4) NOT NULL, longitude numeric(7,4), metro_code integer, area_code integer, CONSTRAINT locations_pkey PRIMARY KEY (id) ); CREATE TABLE blocks ( start_ip bigint NOT NULL, end_ip bigint NOT NULL, location_id bigint NOT NULL, CONSTRAINT blocks_pkey PRIMARY KEY (start_ip, end_ip) );
7: 使用脚本命令导入
chmod +x /tmp/load_geoip.py python /tmp/load_geoip.py --ip4r -l /tmp/GeoIPCity-134-Location.csv -b /tmp/GeoIPCity-134-Blocks.csv --host 127.0.0.1 -U slony -W 12345 -d BeboAndFacebook -g
8. 如果是更新的话,要考虑slony集群环境,先用slonik在主数据库服务器上把表清空,然后再导入新的数据。
参考文章:http://www.siafoo.net/article/53
发表评论
-
PostgreSQL函数:用以查询某表的详细 包含表字段的注释信息
2011-09-07 15:24 15512感谢PostgreSQL论坛阿弟 CREATE OR RE ... -
PostgreSQL 系统表查看系统信息
2011-09-07 15:21 7617摘自http://www.alberton.info/post ... -
Postgresql SQL 使用变量
2010-12-23 17:33 2281begin; select 5::int as var ... -
h2数据库timestamp格式化
2010-10-09 16:17 2610select * from foo2 where FORM ... -
关于设置Postgresql Increment的备份方式
2009-10-19 17:26 1527参考链接: http://hi.baidu.com/top2 ... -
Oracle drop user
2009-09-02 15:26 2532SQL> drop user test cascad ... -
再说Oracle long字段的恢复
2009-09-01 11:38 1568维护的客户系统因为误操作删除了数据,立即进行rman恢复数据到 ... -
Oracle expdp/impdp 导出导出<二>
2009-08-26 16:03 2651由于需要在本地做一下测试,但是由于本地创建oracle和服务器 ... -
Oracle RMAN 增量备份
2009-07-22 10:15 2501在rman增量备份中,有差异增量和累积增量的概念 1、概念 ... -
Oracle执行SQL时遭遇特殊字符&
2009-07-20 14:53 2081转自http://blog.csdn.net/sfdev/ar ... -
Oracle 多行合并一行 方法
2009-06-23 17:59 26489NOTE:特别声明一下内容转自网络 http://www.ni ... -
Oracle监视表空间,并自动增加数据文件脚本
2009-06-23 15:13 3507--- 创建view --- 百分比 crea ... -
Oracle Data Dump 导出 --- 很快,很强大
2009-06-23 10:32 8702--- 创建目录,这是必须的 CREATE DIRE ... -
Oracle 10.2.0.1 升级 10.2.0.4失败后处理
2009-06-23 09:21 2295今天将由Oracle 10.2.0.1.0升级为10.2.0. ... -
Oracle查询long字段
2009-06-15 12:49 3609仅供对一些历史表中的long字段的 查询,生成应用还是像ORA ... -
Oracle 函数返回calendar
2009-05-26 17:44 908转自:http://www.planet-source-cod ... -
简单的Postgresql RETURN NEXT 应用
2009-05-26 17:26 2229一个简单的Postgresql的函数,只是简单的列出用户输入时 ... -
Oracle 归档日志
2009-04-28 16:51 1898-- if it cann't be startup norm ... -
Oracle CPU 占用
2009-04-28 16:38 14261. top PID USER PR ... -
Postgresql 更新备忘
2009-02-26 10:52 998关于Postgresql很好用的联合查询更新 BEGIN; ...
相关推荐
标题中的"GeoIP.dat__GeoLitecity.rar"和描述中的内容暗示了我们讨论的核心是Nginx的GeoIP模块以及相关的数据库文件。 GeoIP模块是Nginx的一个第三方模块,用于获取访问者IP地址的地理位置信息。这个功能对于网站...
`geoip.inc`是一个PHP库,它包含了读取和查询GeoIP数据库的函数,例如`geoip_country_name_by_addr()`,这个函数可以接收一个IP地址作为参数,返回对应的国家名称。 接下来,`ip_2_country.php`是实现IP到国家信息...
使用GeoIP-1.4.8,开发者需要先将库编译为适合自己操作系统的可执行文件或库,然后在自己的应用程序中调用相应的API,如`GeoIP_open()`来打开数据库,`GeoIP_record_by_name()`或`GeoIP_city_by_ip()`来获取IP地址的...
此外,该脚本还有助于下载Maxmind GeoIP2国家/地区数据库的免费版本,并将其放置在Nginx文件夹中。 我还包括Nginx配置以及geoblock脚本,您可以从此处开始进行自定义,以自定义解决国家/地区街区功能的需求。安装将...
geoip2 可解析出ip的位置和所在城市等信息,GeoLite2-City.mmdb数据库,仅供学习使用。
目前市面上绝大多数的代理工具都依赖于 GeoIP2 数据库判断地址所属地。它们的规则结尾部分一般都会有一条类似 GEOIP, CN,用来查询目的 IP 地址是否属于中国大陆,从而判断是否直连。 这些代理工具通常使用的 GeoIP...
4. **获取详细信息**:除了国家代码,还可以获取更详细的信息,如城市名(`geoip_city()`),时区(`geoip_time_zone_by_country_and_city()`),邮政编码(需要高级数据库版本)和经纬度(`geoip_record_by_name()`...
Geo是geographic的缩写,意思是地理的,GeoIP即为IP地理位置数据库,可以根据IP获得地理位置信息。GeoLite2是GeoIP2的免费版本,与GeoIP2数据库相比准确性较差。GeoLite2数据库每周更新国家、城市和自治系统编号信息...
$record = geoip2_city($ip); // 调用GeoIP2的API echo "经度: " . $record->location->longitude . "\n"; echo "纬度: " . $record->location->latitude . "\n"; ?> ``` 这段代码首先引入了`geoip.inc.php`,然后...
此外,为了提高性能,可以使用内存缓存(GEOIP_MEMORY_CACHE)选项,将数据库加载到内存中,避免每次查询时的磁盘I/O操作。 7. **应用场景**:PHP GeoIP扩展常用于网站统计分析、个性化内容推荐、广告定位、内容...
"GeoLite2-City_20190312"是MaxMind的一个特定版本的GeoLite2城市级GEOIP数据库。GeoLite2是免费的,但功能相对有限,相比于商业版的GeoIP2数据库,它可能不包含最新的IP地址信息或者详细程度较低。不过,对于大多数...
geoip 数据库文件
所谓GeoIP,就是通过来访者的IP, 定位他的经纬度...$geo=geoip_open('GeoIP.dat',GEOIP_STANDARD); $counrty= geoip_country_code_by_addr($geo, '202.96.128.166'); $counrty=$counrty?strtolower($counrty):'cn';
GeoIP_1.4.8.tar.gz 是一个与地理信息系统相关的压缩包,它包含了用于识别网络IP地址地理位置信息的库和工具。这个版本是1.4.8,可能包括了更新和修复,以提高性能和稳定性。在IT领域,地理信息系统(GIS)是一种...
GeoLite2-City 数据库比 GeoIP2 City 数据库小,并且更新频率较低,但它仍然提供了相当准确的地理位置数据。 文件扩展名 .mmdb 指的是 MaxMind 的新二进制格式,它用于存储 IP 地址到地理位置的映射。与传统的 ...
GeoLiteASNum.dat GeoIPASNum.dat ,同时我这里包含了csv格式的城市和地区数据库 目前最新版本更新至2024-03-21 通过这几个库,你可以通过ip地址反查ip所在的国家,地区和街道等信息,适用于根据IP地址获取客户端...
更新到2014-01-23,价值25刀的ISP数据库文件
fastcgi_param GEOIP_CITY_COUNTRY_CODE3 $geoip_city_country_code3; fastcgi_param GEOIP_CITY_COUNTRY_NAME $geoip_city_country_name; fastcgi_param GEOIP_REGION $geoip_region; ``` 通过这种方式,Nginx可以...
GeoIP数据库是一种存储了全球互联网IP地址与其对应地理位置信息的数据文件,常用于网络应用中的地理定位服务。这个API使得Python开发者无需依赖C扩展或外部二进制模块,就能直接在Python环境中高效地访问这些数据。 ...
在实际应用中,开发人员可以使用GeoIP库提供的API函数,例如 `GeoIP_open()` 来打开数据库,`GeoIP_country_code_by_ip()` 或 `GeoIP_city_by_ip()` 用于查询IP地址的国家或城市信息。这些函数使开发者能够轻松地将...