docker控制postgers容器导入导出数据

1、从容器中备份数据库

有了这些经历,我决定把postgres中的数据备份起来,免得下次在出现这种情况,我可以直接删库跑路,哈哈哈,扯远了,可以删掉容器,重建,导入数据,不需要那么麻烦去容器中追查木马,搞出来一堆问题。

1、docker exec 进入目标容器:

先docker ps 查看下运行的容器列表

进入目标容器:


docker exec -u root -it 容器名 /bin/bash
2、pg_dump 开始备份

docker 中,以root用户,创建备份目录,直接执行如下命令,


pg_dump -h localhost -p 5432 -U odoo xxx(数据库名) > /数据库dump备份文件目录/export_XXX(数据库名)_bak_2018xxx.dmp

看实际操作如下:

root@f82e7d3a9755:/# pg_dump -h localhost -p 5432 -U dbasuper lszz > /usr/export_lszz_backups.dmp
Password: 
root@f82e7d3a9755:/# ls /usr
bin  export_lszz_backups.dmp  games  include  lib  local  sbin	share  src
root@f82e7d3a9755:/# 

【备份指定表】
很多时候,我们可能更希望不是备份整个数据库而是某些表;

1.1 导出单表数据

pg_dump -h 127.0.0.1 -U admin -p 5432 -W db -t t1 –inserts > bak.sql

1.2 导出多个表数据

pg_dump -h 127.0.0.1 -U admin -p 5432 -W db -t t1 -t t2 –inserts > bak.sql

实际操作

pg_dump -h localhost -p 5432 -U postgres app -t cnb_dzz -t cnb_gsp  > /usr/tmp_20220518.dmp

pg_dump常用参数

-h host,指定数据库主机名,或者IP
-p port,指定端口号
-U user,指定连接使用的用户名
-W,按提示输入密码
dbname,指定连接的数据库名称,实际上也是要备份的数据库名称。
-a,–data-only,只导出数据,不导出表结构
-c,–clean,是否生成清理该数据库对象的语句,比如drop table
-C,–create,是否输出一条创建数据库语句
-f file,–file=file,输出到指定文件中
-n schema,–schema=schema,只转存匹配schema的模式内容
-N schema,–exclude-schema=schema,不转存匹配schema的模式内容
-O,–no-owner,不设置导出对象的所有权
-s,–schema-only,只导致对象定义模式,不导出数据
-t table,–table=table,只转存匹配到的表,视图,序列,可以使用多个-t匹配多个表
-T table,–exclude-table=table,不转存匹配到的表。
–inserts,使用insert命令形式导出数据,这种方式比默认的copy方式慢很多,但是可用于将数据导入到非PostgreSQL数据库。
–column-inserts,导出的数据,有显式列名
3、将文件从容器中拷贝到宿主机

现在备份了但是在容器里需要将其拷贝到宿主机来
拷贝文件从容器里

1、从容器里面拷文件到宿主机?

     答:在宿主机里面执行以下命令

             docker cp 容器名:要拷贝的文件在容器里面的路径       要拷贝到宿主机的相应路径 

     示例: 假设容器名为testtomcat,要从容器里面拷贝的文件路为:/usr/local/tomcat/webapps/test/js/test.js,  现在要将test.js从容器里面拷到宿主机的/opt路径下面,那么命令应该怎么写呢?

     答案:在宿主机上面执行命令

1
docker cp testtomcat:/usr/local/tomcat/webapps/test/js/test.js /opt
  

2、从宿主机拷文件到容器里面

      答:在宿主机里面执行如下命令

              docker cp 要拷贝的文件路径 容器名:要拷贝到容器里面对应的路径

       示例:假设容器名为testtomcat,现在要将宿主机/opt/test.js文件拷贝到容器里面的/usr/local/tomcat/webapps/test/js路径下面,那么命令该怎么写呢?

       答案:在宿主机上面执行如下命令     

1
docker cp /opt/test.js testtomcat:/usr/local/tomcat/webapps/test/js

实际操作

[root@dex leshan]# docker cp postgresql:/usr/export_lszz_backups.dmp /opt

在这里插入图片描述

2、将sql导入到postgres

1、将sql 文件拷贝到容器中usr目录下
[root@dex ~]# docker cp /opt/app.sql postgresql:/usr

2、然后再是要进入容器
[root@dex ~]#  docker exec -u root -it '容器名称' /bin/bash
3、查看导入的sql,已经在usr目录下了
root@f8255:/# ls /usr
app.sql  bin 
4、登录postgres
root@f8255:/# su postgres
5、 创建数据

postgres@f8255:/$ psql
postgres=# CREATE DATABASE app;
postgres=# \q

6、执行导入
postgres@f8255:/$ psql -U postgres app < /usr/app.sql

【注意】如果是导入已存在的表数据,那需要先删除对应已存在的表,再进行导入,不然会提示异常

删除表数据及结构

drop table tableName;

只删除表数据

delete from tableName;
7、查询导入结果
7.1、链接psql
postgres@f8255:/$ psql


7.2、看看数据库
postgres=# \l
                                 List of databases
       Name       |  Owner   | Encoding | Collate |  Ctype  |   Access privileges   
------------------+----------+----------+---------+---------+-----------------------
 app              | postgres | UTF8     | C.UTF-8 | C.UTF-8 | 

7.3、切换数据库
postgres=# \c app
You are now connected to database "app" as user "postgres".

7.4、查看该数据库对应的表
app=# \dt
                    List of relations
  Schema  |           Name            | Type  |  Owner   
----------+---------------------------+-------+----------
 public   | DM_dingqu                 | table | postgres

ok 数据库导入到此已经成功完成了

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奔跑的痕迹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值