阿里云系统盘满了移动pg到数据盘; 数据盘扩容,数据库备份还原
<p>情况: 软件不能登陆,在服务器上查用df -h 查询空间发现系统盘满了,数据盘空间不够用(数据盘已挂载), </p>
<p>解决思路:先做好快照,然后扩容数据盘。删除系统盘下的不重要的文件省出点空间。然后把数据导出到数据盘 然后再新建一个数据库表空间指向数据盘。 再把导出的数据恢复到 新建的数据库中。
注意点:使用resize2fs指令扩大数据盘空大小,原有数据不会丢失。
如果服务器是数据盘是xfs格式的磁盘。
这个是不能使用e2fsck -f /dev/vdb1扩容的。
这边使用 xfs_growfs /dev/vdb1 命令扩容分区成功,</p>
<p>xfs格式磁盘扩容参考文档,<a href="https://help.aliyun.com/knowledge_detail/38063.html">https://help.aliyun.com/knowledge_detail/38063.html</a> </p>
<p>如何操作磁盘原地扩容?<br />
第1步:进入 ECS 控制台;
第2步:选择“全部磁盘“页或者”本实例磁盘“页;
第3步:在每一个磁盘条目的最后选择”更多”;
第4步:选择“磁盘扩容”,即可进入磁盘扩容操作页;<br />
第5步:输入你希望扩容的目标大小
第6步:提交扩容订单
提交成功开通后,可在控制台查看扩容后的的磁盘容量。做完扩容操作后,必须在 ECS 控制台重启实例,扩容才能生效。 </p>
<p>扩容生效后,如何手动扩展存储空间?
第7步:使用xshell 连接 服务器</p>
<p>取消挂载 /data为当前服务器已经挂载数据盘的的目录
第8步:</p>
<pre><code>umount /data</code></pre>
<p>第9步:删除原有分区并新建分区
使用 fdisk 指令,输入 d 来删除原有的分区,然后依次输入 n,p,1 来新建分区,选择 sector 时,这边我们直接回车选择默认值,你也可以按照自己的需求来选择。为了保证数据的一致性,First sector 建议和之前的分区保持一致。</p>
<pre><code>root@iZ94lw423m7Z:~# fdisk /dev/xvdb</code></pre>
<pre><code>Command (m for help): d
Selected partition 1
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-146800639, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-146800639, default 146800639):
Using default value 146800639
Command (m for help): wq
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks. </code></pre>
<p>第10步:使用 resize2fs 指令扩大文件系统大小,原有数据不会丢失。</p>
<pre><code>e2fsck -f /dev/xvdb1
resize2fs /dev/xvdb1</code></pre>
<p>第11步:mount 磁盘
最后,我们再将扩容完毕的磁盘挂载回原有的挂载点</p>
<pre><code>mount /dev/xvdb1 /data</code></pre>
<pre><code></code></pre>
<p>开始移动数据库
使用xshell 连接 服务器</p>
<p>切换用户postgres</p>
<pre><code>su postgres</code></pre>
<p>备份的数据库gy到数据盘中</p>
<pre><code>pg_dump gy & /data/gy.dump</code></pre>
<p>用navicat新建数据库gy_new
表空间设置到数据盘</p>
<p>然后把刚备份的数据导入到刚刚新建的数据库中( 等待备份的时间会比较长 )</p>
<pre><code>psql -U postgres -d gy_new -f /data/gy.dump</code></pre>
<p>更新原来的数据库gy 为 gyold</p>
<pre><code>UPDATE pg_database SET datname='gyold' where datname ='gy';</code></pre>
<p>把刚刚的新库gy_new改为gy</p>
<pre><code>UPDATE pg_database SET datname='gy' where datname ='gy_new';</code></pre>
<p>等待一周 正常的话 删除 gyold</p>