以下是我无法改变的事情: 我们有一个运行主服务器和一些从服务器的 mySQL myISAM 复制。一个从服务器用于使用 mysqldump 进行夜间备份。与主服务器相比,备份使用重锁迫使它的从服务器“老化”。mysqldump 以 root 身份连接转储所有数据库,而每个其他连接都使用一个非超级用户每个数据库。使用专用备份服务器上的简单 shell 脚本启动转储。
问题是:我想在以“普通”用户身份连接到正在备份的服务器上运行的数据库之一时检测备份是否正在运行。Cronjobs 应该能够通过提前退出或仅处理不能等到备份完成的真正重要的必需作业来对正在运行的备份做出反应。运行备份脚本的服务器与网络服务器没有连接,它们唯一的共同点是 mysql 服务器。备份脚本可以做一些事情来将服务器标记为“当前正在运行备份”。我更愿意设置某种“所有用户可见的全局服务器端环境变量”以仅忽略运行备份的一个从属设备,但也可以简单地知道备份正在该数据库或复制链上运行.
我试图在备份开始时创建一个临时表(现有 = 备份正在运行,不存在 = 没有备份运行),但临时表只显示最初创建它的连接(如预期)。我在谷歌上搜索了非超级用户是否可以获得查看包括其他用户和 root 在内的所有连接的 SHOW PROCESSLIST 的权限(来自备份服务器的任何连接 = 备份正在运行) - 但没有运气。向所有数据库用户提供 SUPER 是没有选择的。
有什么建议?
感谢阅读(和回答)。
我们希望以编程方式检测 cron 调度的 pg_dumps 中的错误。
除了检查日志文件是否以“pg_dump:保存数据库定义”结尾:
为了以编程方式检查转储,我还可以grep 其他什么字符串。
对于未来的项目,我需要使用以下设置:
一些小的(离线)数据框(随着时间的推移收集数据)填满了 PostgreSQL 数据库(大约1 TB a year总共)。
有时,我有机会将数据从这些盒子中移出(到棒或移动驱动器上)并将其导入到庞大的企业 Oracle 数据库中。
到目前为止,这希望不是一个非常糟糕的解决方案。目前,我正在寻找准备好以后易于使用的东西。
有没有人做过这样的事情?
有一个 oracle 11g 模式,数据量约为 700 Gb。只有该模式中有表/索引,没有过程/包。
对该模式执行 expdp
expdp schemas=TheSchema directory=dir dumpfile=dump logfile=log content=metadata_only
Run Code Online (Sandbox Code Playgroud)
,由于metadata_only. 在 pl/sql developer 中执行 tools/export-user-objects 会得到一个文本大小为半兆字节的 sql 文件。
但是出现了一个20 Gb 的转储文件!
这个 expdp 创建的转储文件中有什么大的东西,比如索引内容?
如果我只想在另一个模式中创建类似于 TheSchema 中的表,可以做些什么来最小化使用 expdp 完成的转储文件?
UP: schema的text-sql-dump中有不少表/索引:
> grep "create table" TheSchema.sql | wc -l
523
> grep "index" TheSchema.sql | wc -l
501
> grep "partition" TheSchema.sql | wc -l
96
Run Code Online (Sandbox Code Playgroud) 我正在使用 Postgres 9.5。我为我的三个表创建了一个 INSERT 转储文件。为了避免出现外键错误,我将以下内容添加到文件的顶部和底部(“...”是所有插入的位置)...
SET statement_timeout = 0;
SET lock_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET row_security = off;
SET search_path = public, pg_catalog;
ALTER TABLE addresses DISABLE TRIGGER ALL;
ALTER TABLE table1 DISABLE TRIGGER ALL;
ALTER TABLE table2 DISABLE TRIGGER ALL;
…
ALTER TABLE addresses ENABLE TRIGGER ALL;
ALTER TABLE table1 ENABLE TRIGGER ALL;
ALTER TABLE table2 ENABLE TRIGGER ALL;
Run Code Online (Sandbox Code Playgroud)
但是,即使我运行这个文件,我也会收到类似的错误
ERROR: insert or update …Run Code Online (Sandbox Code Playgroud) 我想知道,在制作和存储数据库转储时,有关转储格式的行业标准是什么?
是否将其转储为自定义格式的压缩且不可读的存档,或者只是简单的 .sql?
这是与数据库无关的问题,但以下是 PostgreSQL 的示例来说明这一点:
# MYDATABASE to CUSTOM ARCHIVE
pg_dump -Fc mydatabase > mydatabase.dump
Run Code Online (Sandbox Code Playgroud)
与
# MYDATABASE to SQL
pg_dump -h localhost -U postgres pagila > mydatabase.sql
Run Code Online (Sandbox Code Playgroud) dump ×6
postgresql ×4
oracle ×2
backup ×1
export ×1
foreign-key ×1
insert ×1
migration ×1
monitoring ×1
mysql ×1
mysqldump ×1
pg-dump ×1
recovery ×1
restore ×1