MySQL索引优化小记

发布在 数据库

有2种数据类型,一种重复率高、一种重复率低,选择这2种类型哪个建立索引好?为什么?

之前确实没考虑过这个问题,但觉得既然是使用空间换时间,数据结构本身重复率那么高索引的作用应该就不大了吧。

后来结束到家查看资料后,发现这个名词叫做”离散率”。对于DBA这个问题应该是最最基础的了。

阅读全文

MySQL数据库修复

发布在 数据库

把博客服务器搬到香港之后,发现这个供应商的服务器经常自动重启,不过mysql、nginx都设定了开机自启动,所以也就没当事。结果今天出了大问题:服务器ip可以ping的通,但博客就是无法访问,登录到服务器一看,我擦——整个数据盘不见了!由于把网站放在了/home目录下,而现在home目录空荡荡的啥也没有。

阅读全文

今天升级系统后,发现postgresql无法启动了,报错/etc/ssl/private/ssl-cert-snakeoil.key: Permission denied

一看就是权限问题,首先看这个文件是什么权限:

1
2
# ls -al /etc/ssl/private/ssl-cert-snakeoil.key   
-rw-r----- 1 root ssl-cert 1704 Jul 22 2014 /etc/ssl/private/ssl-cert-snakeoil.key

既然说是权限问题,那么看看postgres用户在不在ssl-cert组中:

1
2
# groups postgres
postgres : postgres ssl-cert

组用户是有可读权限的啊?怎么报错呢?那么把权限改成666试试:

1
# chmod 666 ssl-cert-snakeoil.key

结果报错信息变成了

1
2
2015-05-27 09:16:30 HKT FATAL:  private key file "server.key" has group or world access
2015-05-27 09:16:30 HKT DETAIL: File must be owned by the database user or root, must have no write permission for "group", and must have no permissions for "other".

简单说就是这个文件拥有者必须是数据库用户或root,而且组用户没有写权限,其他用户无权访问。

那么就只能先把权限改回640,并且把用户修改成postgres了:

1
2
# chmod 640 ssl-cert-snakeoil.key
# chown postgres ssl-cert-snakeoil.key

再起动服务,保错信息变成:

1
FATAL: could not open file "/etc/ssl/certs/ssl-cert-snakeoil.pem": Permission denied

同理把pem文件拥有者变成postgres即可,之后就可以成功启动服务了。

评论和分享

postgresql学习记录3

发布在 数据库

某些情况下需要向数据库中插入媒体文件,mysql中插入媒体文件时,数据字段应该是blob。而对于postgresql,则是bytea。这里注意的是打开文件时候应该用”rb wb”这种模式,示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import psycopg2
#省略部分代码...
def ins_pictures(self, name, position, explain, href, uploaddate, img, show_id):
'''向pictures表中插入数据(显示位置,说明,上传时间,图片的2进制)
'''
strs = r"insert into pictures(p_name,p_position,p_explain,p_href,p_uploaddate,p_show,p_img,show_id) values (%(name)s,%(position)s,%(explain)s,%(href)s,%(uploaddate)s,'0',%(img)s,%(show_id)s)"
self.curs.execute(strs, {'name': name,
    'position': position,
    'explain': explain,
    'href': href,
    'uploaddate': uploaddate,
    'img': psycopg2.Binary(img),
    'show_id': show_id,
   })
self.conn.commit()

这里需要注意使用Binary进行转换后才能成功插入到数据库中。

评论和分享

postgresql学习记录2

发布在 数据库

想把mysql数据迁移到postgresql,推荐使用py-mysql2pgsql,使用pip安装即可。

安装完毕后执行py-mysql2pgsql后会在当前目录生成一个yaml文件,根据实际情况修改,例如:

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
# if a socket is specified we will use that
# if tcp is chosen you can use compression
mysql:
hostname: localhost
port: 3306
socket: /var/lib/mysql/mysql.sock #这里用find命令查找
username: testuser
password: '123456' #记得引号
database: testdb
compress: false
destination:
# if file is given, output goes to file, else postgres
file:
postgres:
hostname: localhost
port: 5432
username: mytest
password: '123456'
database: mytest
# if tables is given, only the listed tables will be converted. leave empty to convert all tables.
#only_tables:
#- table1
#- table2
# if exclude_tables is given, exclude the listed tables from the conversion.
#exclude_tables:
#- table3
#- table4
# if supress_data is true, only the schema definition will be exported/migrated, and not the data
supress_data: false
# if supress_ddl is true, only the data will be exported/imported, and not the schema
supress_ddl: false
# if force_truncate is true, forces a table truncate before table loading
force_truncate: false

至于下面的只迁移某些表、不迁移某些表、只要结构、只要数据等根据自己需要修改。

修改完毕后保存,再执行py-mysql2pgsql -v 开始自动迁移。

评论和分享

postgresql学习记录1

发布在 数据库

数据库9.3.5,系统fedora20,不同系统操作略有不同。

使用yum 命令安装即可:sudo yum install postgresql,postgresql-server

安装完毕后系统中会创建一个postgres的用户,切换到这个用户后进行数据库的初始化:

1
initdb --encoding=UTF-8 --no-locale -D /var/lib/pgsql/data/

或者使用postgresql-setup initdb 命令。

紧接着启动服务:pg_ctl -D /var/lib/pgsql/data start

为了方便下面的操作,我重置了postgres用户的密码:

1
2
sudo passwd -d postgres
sudo -u postgres passwd

再把postgres用户赋予执行sudo的权限,设置开机自启动:

1
2
systemctl start postgresql.service
systemctl enable postgresql.service

这时使用psql命令就可以进入数据库终端了。

进入数据库终端之前我们先建立一个数据库:createdb mytest

不过每次想查看数据库都需要切换用户比较麻烦,所以再建立一个和平时使用的账户同名的角色:

1
CREATE ROLE myuser WITH SUPERUSER LOGIN PASSWORD '123456';

这里我为了省事直接把这个用户设置为超级用户,其他细节看官方文档即可。

然后切换回平时使用的账户进行链接即可:psql -h localhost -U myuser mytest (注意大U)

如果上面创建角色时是超级用户或者有相应的权限,也可以直接执行createdb命令创建数据库。

两个用到的配置文件位置:

1
2
_/var/lib/pgsql/data/postgresql.conf_   端口及IP配置
_/var/lib/pgsql/data/pg_hba.conf_   权限配置

这样初期准备工作就做好了。

评论和分享

  • 第 1 页 共 1 页
作者的图片

Roy

微信公众号:hi-roy


野生程序猿


China