zoukankan      html  css  js  c++  java
  • postgresql数据库表空间迁移

    问题背景

    在pg数据库实际使用过程中,随着业务数据的不断累积,会导致磁盘的可用空间越来越小,尤其是在linux下,没办法将原来的磁盘进行扩容,只能够通过加载新的磁盘来进行扩容。如果原来的pg数据库是一个簇,那么可以很好处理,一种是将数据库簇一部分挪走,另一种就是本文讲到的表空间迁移的方式。

    分析

    pg数据库一般默认安装完后有两个表空间,pg_default和pg_golebal。这两个表空间的物理位置都默认在data目录下。如果不进行其他配置的话,那么所有的数据都会存在pg_default中。pg数据库是可以让用户自己创建表空间的,同时指定物理位置。这样的好处就是可以让频繁使用的数据库使用性能好的ssd挂载盘,其他可以放在hdd中,充分考虑到业务的需求。当然也可以进行数据迁移,也就是下面介绍的。

    场景

    工作在linux系统中的主从pg数据库在不断存储数据过程中,挂载在/data1下的数据库pgdata占用空间越来越大,磁盘监控发出报警,为了保证业务的不中断,现在需要将数据进行迁移。

    解决:

    • 首先在linux系统中/data2目录挂载一块新磁盘。这个步骤需要在从数据库中同步进行。
    mkfs.ext4 /dev/sdc
    mount /data2 /dev/sdc
    
    • 在/data2下创建一个目录作为新表空间的数据目录,并给与postgres权限。这个步骤也需要在从数据库中同步进行。
    mkdir /data2/pg_tbs1
    chown -R postgres.postgres /data2/pg_tbs1
    chmod 700 /data2/pg_tbs1
    
    • 创建新的表空间,并指定新创建的目录,这个在主数据库中进行就可以了,从会自动同步。
    
    postgres=# create tablespace tbs_data location '/data2/pg_tbs1';
    CREATE TABLESPACE
    
    • 查看表空间
    postgres=# db+
                                         List of tablespaces
        Name    |  Owner   |    Location    | Access privileges | Options |  Size   | Description 
    ------------+----------+----------------+-------------------+---------+---------+-------------
     pg_default | postgres |                |                   |         | 15 GB   | 
     pg_global  | postgres |                |                   |         | 521 kB  | 
     tbs_data   | postgres | /data2/pg_tbs1 |                   |         | 0 bytes | 
    (3 rows)
    
    
    • 迁移数据库,这个过程还是比较快的,基本就是复制。同样,只需要在主库中进行就行了,从库会自动同步。注意,迁移过程中,TEST库是会加上全局锁的,无法读写。所以在实际中需要协调出业务空闲时间。
    迁移数据库TEST的表空间
    alter database TEST set tablespace tbs_data;
    
    
    • 迁移完毕查看,将近12G的数据库迁移到了新的磁盘中,原来的盘空间释放出来了。
    postgres=# db+
                                         List of tablespaces
        Name    |  Owner   |    Location    | Access privileges | Options |  Size   | Description 
    ------------+----------+----------------+-------------------+---------+---------+-------------
     pg_default | postgres |                |                   |         | 3043 MB | 
     pg_global  | postgres |                |                   |         | 521 kB  | 
     tbs_data   | postgres | /data2/pg_tbs1 |                   |         | 12 GB   | 
    (3 rows)
    

    其他

    总体来说,这种方法还是非常简便的,比直接分离出数据库的方法要容易实现。

  • 相关阅读:
    Cocos2d-x游戏《雷电大战》开源啦!要源代码要资源快快来~~
    Tomcat部署项目时出错java.lang.IllegalStateException: ContainerBase.addChild: start:org.apache.catalina.Life
    PCA主成分分析Python实现
    C语言知识结构之二
    javascript中构造函数的返回值问题和new对象的过程
    poj 1694 An Old Stone Game 树形dp
    Android新技术学习——阿里巴巴免Root无侵入AOP框架Dexposed
    c++中vector向量几种情况的总结(向量指针,指针的向量)
    Hash分析
    三期_day05_Dao层的准备工作_II
  • 原文地址:https://www.cnblogs.com/easonbook/p/11660987.html
Copyright © 2011-2022 走看看