我试图在 MySQL 中删除一个表,但它抱怨“无法删除或更新父行:外键约束失败”......
问题
我一直在想办法完全备份我的 PostgreSQL 数据库。我还没有看到任何解释如何进行完整备份的资源。
我知道 pg_dump 和 pg_dumpall 实用程序。语法很简单,但细节不是很清楚。
看来 pg_dump 只支持特定数据库的“一些”表,而不支持任何类型的配置信息。我猜测诸如权限之类的东西和许多其他东西都没有备份。因此,在完全重新安装 PostgreSQL 数据库的情况下,如果没有大量的手动配置和设置,转储备份将无法工作。
pg_dumpall 备份的内容比 pg_dump 多,但 Postgres 文档中没有提供明确的信息,说明备份转储中还有哪些内容被遗漏了,需要备份。
我需要备份所有 PostgreSQL 配置信息、表、索引、权限、方案等。 如果发生完全灾难,只要我重新安装相同版本的 PostgreSQL,我就不必重新配置任何东西。
例如,我不在乎索引是否是从头开始重新构建的,或者备份是否已经存储了索引......像这样的东西对我来说并不重要......我只希望数据库完全相同还原后的状态与备份时的状态相同。
如果有人可以列出需要备份的内容以实现完整备份,我将不胜感激。当然,如果您能推荐一些工具以及针对列表中各种内容的一些程序,我将不胜感激。请解释您推荐的工具和程序涵盖的总清单上的哪些项目。
我对我之前关于 Inno-Tables 的导入速度的问题进行了跟进(惊喜!)。
场景
我尝试在合理的时间内在我的本地开发机器上导入一些大* 数据库转储。我们有很多KEY附加到表的s 已经证明是一个瓶颈,但对我们的实时系统仍然很重要。
在提出上述问题后,我的方法是KEY ...从转储、导入和重新添加密钥中删除语句。
但是,我经常发现自己编辑当前转储以将其导入到本地,并且偶然发现了这些有趣的“评论”(disable/enable keys-lines)
--
-- Dumping data for table `monster`
--
LOCK TABLES `monster` WRITE;
/*!40000 ALTER TABLE `monster` DISABLE KEYS */;
INSERT … INSERT … INSERT
/*!40000 ALTER TABLE `monster` ENABLE KEYS */;
UNLOCK TABLES;
Run Code Online (Sandbox Code Playgroud)
但实际上这些“注释”是有条件的 MySql-Statements
这对我来说是新闻,但好吧,考虑到输出形式mysql --version,我觉得一切都很好:
mysql Ver 14.14 Distrib 5.5.38, for debian-linux-gnu (x86_64) using readline 6.3
我的假设
表已锁定(很好,只有我在开发机器上)。然后禁用表模式中定义的键,导入数据,启用键。
因此,在“数据插入”阶段,不应将时间浪费在键上,而是在插入所有数据后进行检查。
我会认为这与我KEY 'foo' (foo)'从转储中删除所有 - …
Slony-I还有用吗,如果有,它是什么?为了澄清起见,从 9.0 Postgresql 开始支持内置流复制。
我将MEMORY Engine用于与特定 MYSQL 查询关联的所有表,因为访问速度对我的项目至关重要。
出于某种原因,我注意到仍然会发生大量磁盘写入。
这是因为 Windows 将 RAM 交换到磁盘吗?我怎样才能防止这种情况发生?
编辑:这是我的全局变量:
mysql> show global variables;
+---------------------------------------------------+--------------------------------------------------------------------------------
------------------------------+
| Variable_name | Value
|
+---------------------------------------------------+--------------------------------------------------------------------------------
------------------------------+
| auto_increment_increment | 1
|
| auto_increment_offset | 1
|
| autocommit | ON
|
| automatic_sp_privileges | ON
|
| back_log | 50
|
| basedir | C:/Program Files/MySQL/MySQL Server 5.5/
|
| big_tables | OFF
|
| binlog_cache_size | 32768
|
| binlog_direct_non_transactional_updates | OFF
|
| binlog_format | STATEMENT
|
| …Run Code Online (Sandbox Code Playgroud) 我正在运行一个 facebook 应用程序,目前有 300 - 600 个并发用户(并且还在增长)。为了让硬件为增长做好准备,我将 i7 / 12gb ram / 2x 80gb intel x25 ssd(debian 5.0 / mysql 5.0 / 64bit)更改为 bi-xeon / 24gb ram / 2x 120gb intel 320 ssd /mysql . 64 位)。
现在我面临的问题是性能比“小盒子”差。在两台服务器上,我一直在使用 nginx/php fcgi 来提供内容。
我只使用 innodb,读取/写入大约 65%/35%。大约 800 - 1000 qps,但所有查询都很简单,永远不会加入超过 1 个额外的表。所有索引都已设置,并且没有单独的查询记录在慢日志中(> 2 秒)。目前我有大约 400MB 的数据(大约 1GB 的索引)预计它每个月都会翻一番。
我很喜欢每个可以给我一个提示的人,他们应该改变什么才能让它运行得更顺畅。
i7盒子上的旧配置是这样的(混合myisam / innodb),在800+用户下表现相当不错。
旧的my.cnf
key_buffer = 3000M
max_allowed_packet = 128M
thread_stack = 192K
thread_cache_size = 8
max_connections = 400
table_cache = 8000
thread_concurrency …Run Code Online (Sandbox Code Playgroud) 寻找一种策略或工具来处理在繁忙的复制系统中将单个数据库恢复到某个时间点的问题。
我有 12 个数据库在主从复制配置中的 2 个 MySQL 5.0.77 服务器上运行。每天对只读从站进行完整转储,并且有可用的增量 SQL 转储,这些备份是异地备份,复制状态受到监控。
编辑:表是 InnoDB 和 myISAM 的混合体,因此引擎特定的解决方案不可用。
因此,如果主服务器完全故障,我可以中断复制并提升从服务器,我还可以选择重建新服务器并从越位完整备份进行配置,然后应用从从服务器每小时获取的差异。
但是我担心如何处理部分故障或单个数据库的故障。我可以想到 2 个很有可能的场景;
目前我有一堆完整的转储作为 FULL-$DATE-all-databases.sql.gz 文件,以及可以应用于完整转储的差异作为 DIFF-$DATE-all-databases.sql.gz
要将数据库 7 恢复到某个时间点,需要通过 FULL 和 DIFF 文件进行 grep,并手动应用该 sql。
我应该如何继续以便能够恢复到以前的 DIFF 转储之一到主数据库?
我需要备份到单个数据库文件,即
mysqldump --databases "database1" | gzip > database1.sql.gz
mysqldump --databases "database2" | gzip > database2.sql.gz
mysqldump --databases "database3" | gzip > database3.sql.gz
Run Code Online (Sandbox Code Playgroud)
而不是..
mysqldump --master-data --lock--all-databases --all-databases | gzip > all-databases.sql.gz
Run Code Online (Sandbox Code Playgroud)
如果我使用单独的 mysqldump 文件,主数据二进制日志会发生什么,我什至应该为主服务器恢复转储设置 --master-data 吗?
将客户的数据库移动到额外的服务器后,我们遇到了问题。这应该会对站点的性能产生积极的影响,但是 MyISAM 中的表锁定存在问题。(我听说过使用 InnoDB 代替 MyISAM,但我们不能在不久的将来更改引擎)。
我们可以发现它是一个更新查询,当主持人在文章站点上激活评论时执行该查询。这是过程:
SET status = 1 WHERE id = 5(设置索引)此时整个页面变得缓慢。数据库本身忙了几分钟。我取了几次进程列表,看到大约 60 个不同选择查询的条目,它们都处于等待表级锁定的状态。
1.我不明白为什么表上的这个更新article_comments会影响表的选择语句article以等待表级锁。在 processlist 中,几乎所有等待的查询都来自该表。我已经读过更新/插入比选择更受欢迎的事实,这可能会导致此类问题,但是当评论被激活时,文章表本身不会更新,因此选择不应该等待。我误解了吗?
2. 除了更改为 InnoDB 之外,还有什么可以防止这种行为或至少是为了获得更好的平衡吗?我对在将数据库移动到新服务器之前没有出现这个问题感到非常恼火。我想有一些配置错误,但我不知道如何识别。
我有一个大表(几亿行),我想对其进行有效分区。我的问题是分区大小和分区数之间是否存在权衡。据我所知,分区中使用的列上的大多数查询会更快,因为查询(对于大多数查询)只需要在适用于查询的分区内进行搜索。因此,为了最大限度地提高效率,您应该将大表划分为最大数量的分区,从而使每个分区尽可能小是有道理的。对于 MySQL,这意味着 1024 个分区。但是,拥有大量分区是否有任何性能缺陷?是这样,如何找到最佳分区数?
注意:在 stackoverflow 上已经有一个有点类似的问题,但只有一个答案,(从我的角度来看)没有达到目标。所以我会用我自己的方式陈述这个问题......希望它更清楚
如何列出当前数据库中的所有表,以及该表的行数。
换句话说,你能想出一个查询来在 mysql 中提出这样的事情吗?
+------------------------++------------------------+
| Tables_in_database | Number of rows |
+------------------------++------------------------+
| database 1 | 1000 |
| database 2 | 1500 |
+------------------------++------------------------+
Run Code Online (Sandbox Code Playgroud)
欢迎使用不同的方法。
mysql ×8
innodb ×4
performance ×3
backup ×2
myisam ×2
mysqldump ×2
postgresql ×2
replication ×2
count ×1
index ×1
locking ×1
memory ×1
my.cnf ×1
mysql-5.0 ×1
mysql-5.5 ×1
partitioning ×1
select ×1