从Segment失效中恢复

从Segment失效中恢复

Segment主机失效通常会导致多个Segment失效:在该主机上的所有主Segment或者镜像Segment都被标记为“down”并且不可操作。如果没有启用镜像并且一个Segment宕掉,系统会自动变成不可操作。

在启用了镜像的情况下恢复

  1. 确定可以从Master主机连接到该Segment主机。例如:
    $ ping failed_seg_host_address
  2. 排查解决妨碍Master主机连接到Segment主机的问题。例如,主机可能需要被重启或者替换。
  3. 在主机上线并且能连接到它后,从Master主机运行gprecoverseg工具来重新激活失效的Segment实例。例如:
    $ gprecoverseg
  4. 恢复过程会启动失效的Segment并且确定需要同步的已更改文件。该过程可能会花一些时间,请等待该过程结束。在此过程中,数据库的写活动会被禁止。
  5. gprecoverseg完成后,系统会进入到Resynchronizing模式并且开始复制更改过的文件。这个过程在后台运行,而系统处于在线状态并且能够接受数据库请求。
  6. 当重新同步过程完成时,系统状态是Synchronized。运行gpstate工具来验证重新同步过程的状态:
    $ gpstate -m

要让所有Segment返回到它们的首选角色

当一个主Segment宕掉后,镜像会激活并且成为主Segment。在运行gprecoverseg之后,当前活动的Segment仍是主Segment而失效的Segment变成镜像Segment。这些Segment实例并没有回到在系统初始化时为它们指定的首选角色。这意味着,如果Segment主机上的活动Segment数量超过了让系统性能最优的数量,系统可能处于一种潜在地非平衡状态。要检查非平衡的Segment并且重新平衡系统,运行:

$ gpstate -e

所有Segment都必须在线并且被完全同步以重新平衡系统。在重新平衡过程中,数据库会话保持连接,但正在进行的查询会被取消并且回滚。

  1. 运行gpstate -m来确保所有镜像都是Synchronized
    $ gpstate -m
  2. 如果有任何镜像处于Resynchronizing模式,等它们完成。
  3. 用-r选项运行gprecoverseg,让Segment回到它们的首选角色。
    $ gprecoverseg -r
  4. 在重新平衡之后,运行gpstate -e来确认所有的Segment都处于它们的首选角色。
    $ gpstate -e

要从双重故障中恢复

在双重故障中,主Segment和它的镜像都宕掉。如果在不同的Segment主机上同时发生硬件失效,就有可能发生这种情况。如果发生双重故障,Greenplum数据库会变得不可用。要从一次双重故障中恢复:

  1. 重启Greenplum数据库:
    $ gpstop -r
  2. 在系统重启后,运行gprecoverseg
    $ gprecoverseg
  3. gprecoverseg完成后,使用gpstate检查镜像的状态:
    $ gpstate -m
  4. 如果仍有Segment处于Change Tracking模式,运行一次完整复制恢复:
    $ gprecoverseg -F

如果无法恢复一台Segment主机并且损失了一个或者多个Segment,可以从备份文件中重新创建Greenplum数据库系统。请见备份和恢复数据库

在没有启用镜像的情况下恢复

  1. 确定能够从Master主机连接到该Segment主机。例如:
    $ ping failed_seg_host_address
  2. 排查解决妨碍Master主机连接到Segment主机的问题。例如,主机可能需要被重新启动。
  3. 在主机在线之后,验证能够连接到它并且重启Greenplum数据库。例如:
    $ gpstop -r
  4. 运行gpstate工具验证所有的Segment实例都在线:
    $ gpstate