Greenplum中管理数据

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Fortyone41/article/details/51935155

1.管理数据

1.1.关于GP的并发控制

1) GP使用多版本控制模型(Mutltiversion Concurrency Control/MVCC)保持数据一致性;
可将MVCC看成行级别锁的一种妥协,它在许多情况下避免了使用锁,同时可以提供更小的开销。根据实现的不同,它可以允许非阻塞式读,在写操作进行时只锁定必要的记录。MVCC会保存某个时间点上的数据快照。这意味着事务可以看到一个一致的数据视图,不管他们需要跑多久。这同时也意味着不同的事务在同一个时间点看到的同一个表的数据可能是不同的。如果你从来没有过种体验的话,可能理解起来比较抽象,但是随着慢慢地熟悉这种理解将会很容易。
2) MVCC以避免给数据库事务显式锁定的方式,最大化减少锁争用以确保多用户环境下的性能;
3) GP提供了各种锁机制来控制对表数据的并发访问;
4) GP为每个事务提供事务隔离;

1.2.插入新纪录

1) 需要表名和该表每列的值使用INSERT命令插入数据,GP是自动提交;
2) 显式的指定列名插入数据,当不知道当前表中列名时;
3) 从另一个表中获取并插入到当前表;
4) 使用一个命令插入多条记录,AO表为批量装载做了优化,不建议在AO表上使用单条的INSERT语句。

devdw=# \h insert         查看当前insert命令的帮助
Command:     INSERT
Description: create new rows in a table
Syntax:
INSERT INTO table [ ( column [, ...] ) ]
    { DEFAULT VALUES | VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }
    [ RETURNING * | output_expression [ AS output_name ] [, ...] ]
devdw=# \d tb_cp_02
      Table "public.tb_cp_02"
 Column |     Type     | Modifiers
--------+--------------+-----------
 id     | integer      |
 rank   | integer      |
 year   | integer      |
 gender | character(1) |
 count  | integer      |
Indexes:
    "bmidx_01" bitmap (count)
Number of child tables: 5 (Use \d+ to list them.)
Distributed by: (id)

devdw=# insert into tb_cp_02(id,rank,year,gender,count) values (1,2,3,'M',4);  往tb_cp_02表中逐个字段的添加数据
INSERT 0 1

devdw=# select * from tb_cp_02;   查看当前tb_cp_02表中数据
 id | rank | year | gender | count
----+------+------+--------+-------
  1 |    2 |    3 | M      |     4
(1 row)


devdw=# insert into tb_cp_02(rank,year,gender,count,id) values (3,4,'W',5,2);  往tb_cp_02表中随机字段的添加数据
INSERT 0 1
devdw=# select * from tb_cp_02;
 id | rank | year | gender | count
----+------+------+--------+-------
  1 |    2 |    3 | M      |     4
  2 |    3 |    4 | W      |     5
(2 rows)
devdw=# insert into tb_cp_02  select * from tb_cp_02; 通过查询tb_cp_02表中数据后再往其中插入数据
INSERT 0 2
devdw=# select * from tb_cp_02;
 id | rank | year | gender | count
----+------+------+--------+-------
  1 |    2 |    3 | M      |     4
  1 |    2 |    3 | M      |     4
  2 |    3 |    4 | W      |     5
  2 |    3 |    4 | W      |     5
(4 rows)

1.3.更新记录

Command:     UPDATE                                 查看update的帮助
Description: update rows of a table
Syntax:
UPDATE [ ONLY ] table [ [ AS ] alias ]
    SET { column = { expression | DEFAULT } |
          ( column [, ...] ) = ( { expression | DEFAULT } [, ...] ) } [, ...]
    [ FROM fromlist ]
    [ WHERE condition ]
    [ RETURNING * | output_expression [ AS output_name ] [, ...] ]

1) 更新是对数据库的现有数据进行修改,可修改全部或部分记录;
2) 每个列都可以被单独的更新,而不影响其他列;
3) 要执行更新,需要如下3方面的消息:
要被更新的表和列
列的新值
需要被更新的列必须匹配的条件
4) 使用UPDATE命令更新表中的记录;
5) GP中使用UPDATE的限制:GP的DK不可以被UPDATE;

1.4.删除记录

1) 使用DELETE命令从指定的表中删除符合WHERE条件的记录,或者删除表中所有记录;
2) 使用TRUNCATE命令快速删除所有记录。

devdw=# \h delete    查看delete命令的帮助
Command:     DELETE
Description: delete rows of a table
Syntax:
DELETE FROM [ ONLY ] table [ [ AS ] alias ]
    [ USING usinglist ]
    [ WHERE condition ]
    [ RETURNING * | output_expression [ AS output_name ] [, ...] ]

devdw=# \h truncate   查看truncate命令的帮助
Command:     TRUNCATE
Description: empty a table or set of tables
Syntax:
TRUNCATE [ TABLE ] name [, ...] [ CASCADE | RESTRICT ]

1.5.事务管理

1) 事务允许将多个SQL语句放在一起作为一个整体操作,所有SQL一起成功或失败
2) 使用事务,在GP中执行事务的SQL命令:
使用BEGIN或START TRANSACTION开始一个事务块;
使用END或COMMIT提交事务块;
使用ROLLBACK回滚事务而不提交任何修改;
使用SAVEPOINT选择性的保存事务点,之后可以使用ROLLBACKTO SAVEPOINT回滚到之前保存的事务。
3) 事务隔离级别:SQL标准定义了4个事务隔离级别:
已提交读(缺省)
当事务使用该隔离级别,SELECT查询只能看到查询开始前的数据,其永远读不到SELECT查询期间其他并发事务未提交或已提交的修改。
可串行化
这是严格的事务隔离级别。该级别要求事务被串行执行,也就是事务必须一个接一个的执行而不是并行执行。
未提交读
在GP中与已提交读等同
可重复读
在GP中与串行化等同
依次查看begin/end/rollback/commit/savepoint的帮助说明

devdw=# \h begin
Command:     BEGIN
Description: start a transaction block
Syntax:
BEGIN [ WORK | TRANSACTION ] [ transaction_mode [, ...] ]
where transaction_mode is one of:
    ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }
    READ WRITE | READ ONLY
devdw=# \h end
Command:     END
Description: commit the current transaction
Syntax:
END [ WORK | TRANSACTION ] 
devdw=# \h rollback
Command:     ROLLBACK
Description: abort the current transaction
Syntax:
ROLLBACK [ WORK | TRANSACTION ]
devdw=# \h commit
Command:     COMMIT
Description: commit the current transaction
Syntax:
COMMIT [ WORK | TRANSACTION ]
devdw=# \h savepoint
Command:     SAVEPOINT
Description: define a new savepoint within the current transaction
Syntax:
SAVEPOINT savepoint_name
devdw=# begin;   开启事务
BEGIN
devdw=# insert into tb_cp_02 values(5,6,7,'G',8);  向tb_cp_02表中增加数据
INSERT 0 1
devdw=# commit;                   提交
COMMIT
devdw=# end;                      结束事务
WARNING:  there is no transaction in progress
COMMIT
devdw=# select * from tb_cp_02;
 id | rank | year | gender | count
----+------+------+--------+-------
  1 |    2 |    3 | M      |     4
  1 |    2 |    3 | M      |     4
  5 |    6 |    7 | G      |     8
  2 |    3 |    4 | W      |     5
  2 |    3 |    4 | W      |     5
(5 rows)

devdw=# begin;   开启事务
BEGIN
devdw=# insert into tb_cp_02 values(5,6,7,'G',8); 向tb_cp_02表中增加数据
INSERT 0 1
devdw=# rollback;                    回滚事务
ROLLBACK
devdw=# end;                         结束事务
WARNING:  there is no transaction in progress
COMMIT
devdw=# select * from tb_cp_02;
 id | rank | year | gender | count
----+------+------+--------+-------
  1 |    2 |    3 | M      |     4
  1 |    2 |    3 | M      |     4
  5 |    6 |    7 | G      |     8
  2 |    3 |    4 | W      |     5
  2 |    3 |    4 | W      |     5
(5 rows)

devdw=# begin;   开启事务
BEGIN
devdw=# insert into tb_cp_02 values(5,6,7,'G',8); 向tb_cp_02表中增加数据
INSERT 0 1
devdw=# savepoint a;    创建保存点a
SAVEPOINT
devdw=# insert into tb_cp_02 values(78,6,7,'G',8);   再次向tb_cp_02表中增加数据
INSERT 0 1
devdw=# rollback to a;                   回滚到保存点a
ROLLBACK
devdw=# end;                            结束事务  此时第二条数据是没有插入成功的
COMMIT
devdw=# select * from tb_cp_02;
 id | rank | year | gender | count
----+------+------+--------+-------
  1 |    2 |    3 | M      |     4
  1 |    2 |    3 | M      |     4
  5 |    6 |    7 | G      |     8
  5 |    6 |    7 | G      |     8
  2 |    3 |    4 | W      |     5
  2 |    3 |    4 | W      |     5
(6 rows)

1.6.回收空间和分析

1) 事务ID管理:系统目录维护在每个数据库每在每个数据库每2百万个事务的时候,对每张表执行VACUUM是很有必要的。
2) 系统目录维护:大量的CREATE和DROP命令会导致系统表的迅速膨胀,以至于影响系统性能。
由于MVCC事务并发模型的原因,已经删除或者更新的记录仍然占据着磁盘空间。
如果数据库有大量的更新和删除操作,将会产生大量的过期记录
定期的运行VACUUM命令可以删除过期记录,回收空间。

devdw=# \h vacuum         查看vacuum的帮助
Command:     VACUUM
Description: garbage-collect and optionally analyze a database                垃圾回收并且可选择性的分析一个数据库
Syntax:
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ table ]
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] ANALYZE [ table [ (column [, ...] ) ] ]

devdw=# vacuum full;   分析当前数据库
NOTICE:  'VACUUM FULL' is not safe for large tables and has been known to yield unpredictable runtimes.
HINT:  Use 'VACUUM' instead.           'VACUUM FULL'这个命令对于大的表是不安全的且花费的时间也不可预计,建议使用‘VACUUM’替换               
VACUUM

1.7.日常重建索引

1) 配置子空间映射
过期的记录会被存放在叫做自由空间映射的地方;
超出自由映射空间的过期记录所占用的空间无法回收;
VACUUM FULL命令将回收所有过期记录,但是耗时长;
使用CREATE TABLE AS来处理自由空间溢出的情况
自由映射空间的设置参数:max_fsm_pages(默认是200000)和max_fsm_relations(默认是1000) 为优化查询进行回收和分析
GP使用基于成本的查询优化器,ANALYZE命令收集查询优化器需要的统计信息,VACUUM ANALYZE可以一起执行;
3) 对于B-tree索引,新重建的索引比存在较多更新的索引更快;
4) 重建索引可以回收过期的空间;
5) 在GP中,删除索引然后创建通常比REINDEX更快,当更新索引列时,Bitmap索引不会被更新;

1.8.管理GPDB日志文件

1) 数据库服务日志文件
GP的日志输出量大而且不需要无期限的保存这些日志,管理员需要定期的滚动日志文件
GP在Master和所有Segment实例上开启了日志文件按天滚动
服务器日志文件存放在每个实例数据目录的pg_log目录下,格式:gpdb-YYYY-MM-DD_TIME.csv
2) 搜索数据库服务日志文件
通过gplogfilter工具来查找匹配指定标准的日志数据,默认只查找默认目录下的Master日志文件
例如, 显式master日志文件的最近3行记录: $ gplogfilter –n 3
使用gplogfilter+gpssh工具组合在所有segment节点进行查找
例如,显式每个segment日志文件的最近三行

$ gpssh –f seg_host_file=> gplogfilter –n 3 /data/primary/*/pg_log/gpdb*.csv

3) 程序日志文件
缺省位于~/gpAdminLogs目录下
命令方式:<script_name>_<date>.log
日志记录的格式:

<timestamp>:<utility>:<host>:<user>:[INFO|WARN|FATAL]:<message>

没有更多推荐了,返回首页