扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
oid是一个系统的隐藏列。直接修改是不行的。
专注于为中小企业提供成都网站建设、网站设计服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业清涧免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了上1000+企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。
mysql=# update pg_class set oid = 99999 where oid=73728;
ERROR: cannot assign to system column "oid"
LINE 1: update pg_class set oid = 99999 where oid=73728;
但是我们可以将其删除
mysql=# delete from pg_class where oid=73728;
DELETE 1
在postgresql中有一个copy命令,有一个参数 with oids,可以将oid一起导入,利用这个特性,我们可以达到oid的修改功能。
1.首先新建一个文件,将数据放入,新的oid已修改
[mysql@pttest4 cxf]$ cat 2.dat
73740|test|2200|73729|10|0|73740|0|0|0|0|0|f|f|r|1|0|0|0|0|0|f|f|f|f|814|/N|/N
2.使用copy命令导入数据
copy pg_class from '/home/mysql/cxf/2.dat' null as E'//N' csv delimiter '|' oids;
3.修改其他表中的对应oid数据
update pg_attribute set attrelid ='73740' where attrelid ='73728';
update pg_depend set refobjid='73740' where refobjid ='73728';
update pg_type set typrelid ='73740' where typrelid = '73728';
ps:如果还涉及其他的数据字典,应一并修改掉
4.查询,可以看出oid已变更
mysql=# select * from test;
ERROR: could not open relation 1663/16386/73740: No such file or directory
mysql=# select oid from pg_class where relname ='test';
oid
-------
73740
(1 row)
5.将数据文件更名为新的oid
[mysql@pttest4 16386]$ mv 73728 73740
再查数据库,原有的那条数据还是可以访问到的。
mysql=# select * from test;
a
---
1
(1 row)
至此,oid修改成功。
修改oid引发的其他问题。由于当前系统的oid是73735,而我们变更的oid(73740)在这个之后,接着我们创建表的时候这个oid还会重用,这样有可能会造成oid错乱。如下
mysql=# create table helloworld(b varchar(1));
CREATE TABLE
mysql=# select oid from pg_class where relname='helloworld';
oid
-------
73735
(1 row)
mysql=# create table helloworld1(b varchar(1));
CREATE TABLE
mysql=# create table helloworld2(b varchar(1));
CREATE TABLE
mysql=# create table helloworld3(b varchar(1));
CREATE TABLE
mysql=# select oid from pg_class where relname like 'helloworld%';
oid
-------
73735
73737
73739
73741
(4 rows)
mysql=# select * from pg_type where oid = '73740';
typname | typnamespace | typowner | typlen | typbyval | typtype | typisdefined | typdelim | typrelid | typelem | typinput | typoutput | typreceive | typsend | typanalyze | typalign | typstorage | typnotnull | typbasetype | typtypmod | typndims | typdefaultbin | typdefault
-------------+--------------+----------+--------+----------+---------+--------------+----------+----------+---------+-----------+------------+-------------+-------------+------------+----------+------------+------------+-------------+-----------+----------+---------------+------------
helloworld2 | 2200 | 10 | -1 | f | c | t | , | 73739 | 0 | record_in | record_out | record_recv | record_send | - | d | x | f | 0 | -1 | 0 | |
(1 row)
可以看到,新的pg_type的oid用到了73740。
为了避免这种情况,我们可以用pg_resetxlog重置oid。
如:pg_resetxlog -o 80000 ~/postgresql/data/
这样子建表的时候oid就重80000开始了,避免了刚刚那个问题。
postgresql.conf是PostgreSQL的配置文件。其基本格式为: 一行就是一个配置变量的设定,采用"变量名 = 变量值"的赋值格式。
postgresql.conf一般位于postgresql的数据目录中,它是在postgresql数据集创建时自动创建出来的。可以通过修改postgresql.conf来修改PostgreSQL的配置变量值。
Services Management”即“服务”中停止相应的PostgreSQL服务
方式二:通过命令行“NET STOPpostgresql-x64-9.1”停止相应的PostgreSQL服务Step 2:修改注册表对应键值位置在"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\postgresql-x64-9.1
\ImagePath
",将“-D”后的目录名修改为新的数据目录位置即可,如果目录路径中含有空格,需要用引号引起。Step 3:数据迁移
拷贝数据至新数据目录,需要注意必须检查用户权限是否可于访问新的数据目录。Step 4:开启PostgreSQL服务
或者使用命令行命令“NETSTARTpostgresql-x64-9.1”[Linux]修改postgresql.conf文件,
data_directory = '
新数据目录名'
,然后重启postgresql服务即可。
修改完毕后,可以用psql命令“showdata_directory”查看当前数据目录
要想打开自动字符集转换功能,你必须告诉 PostgreSQL 你想在客户端使用的字符集(编码)。你可以用好几种方法实现这个目的。
用 psql 里的 /encoding 命令。 /encoding 允许你动态修改客户端编码。 比如,把编码改变为 SJIS,键入:
/encoding SJIS
使用 libpq 函数。 /encoding 在做此用途的时候实际上是调用 PQsetClientEncoding()。
int PQsetClientEncoding(PGconn *conn, const char *encoding);
这里 conn 与后端的联接,而 encoding 是你想用的编码。如果编码设置成功它返回 0,否则返回 -1。本次联接的当前编码可以用下面函数显示:
int PQclientEncoding(const PGconn *conn);
请注意它只返回编码 ID,而不是象 EUC_JP 这样的编码符号字串。 要把编码 ID 转换为编码符号,你可以用:
char *pg_encoding_to_char(int encoding_id);
使用 SET client_encoding TO。 可以用 SQL 命令设置客户端编码:
SET CLIENT_ENCODING TO 'value';
你还可以把 SQL 语法里的 SET NAMES用于这个目的:
SET NAMES 'value';
查询当前客户端编码:
SHOW client_encoding;
返回缺省编码:
RESET client_encoding;
使用 PGCLIENTENCODING。 如果在客户端的环境里定义了 PGCLIENTENCODING 环境变量, 那么在与服务器进行联接时将自动选择客户端编码。 (这个编码随后可以用上面谈到的任何其它方法覆盖。)
使用client_encoding配置变量。 如果在 postgresql.conf 里设置了 client_encoding 变量, 那么在与服务器建立了联接之后,这个客户端编码将自动选定。(这个设置随后可以被上面提到 的其他方法覆盖。)
假如无法进行特定的字符转换 — 比如, 你选的服务器编码是EUC_JP, 客户端是LATIN1,那么有些日文字符不能转换成LATIN1。这时, 不能用LATIN1字符集表示的字母将被转换成圆括弧包围的十六进制,像,(826C) 这样。
如果客户端字符集定义成了 SQL_ASCII,那么编码转换会被关闭, 不管服务器的字符集是什么都一样。和服务器一样,除非你的工作环境全部是 ASCII 数据, 否则使用 SQL_ASCII 是不明智的。
1、首先,要用CRT软件连接Linux系统。
2、首选,确认是用root用户登录系统的。
输入命令:
id
,查看登录用户信息。3、若修改root自己的密码,直接输入
passwd
.
输入两遍,新密码即可。
4、若修改其他用户,如oracle
的密码,可直接输入passwd
oracle.
输入两遍性新密码即可。
5、这样就修改成功了。
1. 修改配置文件/etc/postgresql/9.3/main/postgresql.conf
data_directory = '/home/pgdata'
2. 修改data_directory的所有者
chown -R postgres:postgres /home/pgdata
3. 这时候启动会报error
* The PostgreSQL server failed to start. Please check the log output:
2014-11-25 09:55:02 CST FATAL: data directory "/home/pgdata" has group or world access
2014-11-25 09:55:02 CST DETAIL: Permissions should be u=rwx (0700).
根据提示修改数据目录权限
chmod 700 /home/pgdata
4. 启动依然会报错
* The PostgreSQL server failed to start. Please check the log output:
2014-11-25 09:56:17 CST FATAL: "/home/pgdata" is not a valid data directory
2014-11-25 09:56:17 CST DETAIL: File "/home/pgdata/PG_VERSION" is missing.
把默认数据目录的东西拷贝过来
cp -r /var/lib/postgresql/9.3/main/* /home/pgdata
5. 启动 service postgresql start
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流