我是一名应用程序开发人员,想知道我们的数据库备份策略。现在我们的系统管理员每 8 小时备份一次我们的数据库。我真的不知道怎么做,但是当备份运行时,我们的应用程序响应时间会飞快地过去。所以每 8 小时,应用程序就会变慢,有时甚至会产生错误。
有没有办法用 MyISAM 表备份 MySQL 数据库,而不会减慢应用程序代码的速度,并且仍然可以获得一致的备份?
我很好奇。
我有商务桌。现在我想我将不得不创建一个单独的表,位置表。那个单独的表应该是myisam。
但我为什么要这样做?
为什么innodb不能存储积分?
对于“并发插入”,MySQL参考手册有如下解释:
MyISAM 存储引擎支持并发插入,以减少给定表的读写器之间的争用:如果 MyISAM 表在数据文件中没有空洞(中间删除了行),则可以执行 INSERT 语句将行添加到最后SELECT 语句从表中读取行的同时。
http://dev.mysql.com/doc/refman/5.5/en/concurrent-inserts.html
假设我们的数据库“并发插入”参数设置为“自动”(1)。
我们有一个有间隙的 MyISAM 表。当我们插入新行并填补这些空白时,表是否“立即”准备好接受未来插入查询的“并发插入”?
或者我们是否需要在表知道没有间隙之前运行“优化”?
我有一个继承的 MySQL 数据库的问题。mysqld 有时会使用高达 2300% 的 CPU。唯一的解决方案是服务 mysql stop 并在表上运行 myisamchk -r。修复索引后,我启动 MySQL,一切正常。
关于永久解决方案的任何想法?
编辑(来自评论):
使用 5.5.29-0ubuntu0.12.04.2-log
key_buffer = 16M max_allowed_packet = 16M 线程堆栈 = 128K 线程缓存大小 = 8 myisam-recover = 备份 最大连接数 = 500 #table_cache = 512 #thread_concurrency = 10 query_cache_limit = 1M query_cache_size = 16M
SELECT SUM(index_length) ndxsize
FROM information_schema.tables
WHERE engine='MyISAM'
Run Code Online (Sandbox Code Playgroud)
返回
+-----------+ | ndxsize | +-----------+ | 59862016 | +-----------+
SELECT SUM(data_length+index_length)/power(1024,2) datndxsize
FROM information_schema.tables
WHERE engine='MyISAM'
Run Code Online (Sandbox Code Playgroud)
返回:
+--------------------+ | 数据大小 | +--------------------+ | 488.69915199279785 | …
在我目前使用的 MyISAM 中,数据库非常小,并保留了几个星期,之后它们会被删除并完全用干净的石板重建。该脚本使用 MYISAM 表,除了在最新的 MYSQL 版本中缺乏支持之外,我从来没有遇到过它们工作方式的问题。
更改为 INNODB 是一件耗时且收益为零的事情。但是,我担心最终可能会出现旧 MySQL 版本不可用或某些其他进程强制迁移的情况。
我的问题是:有谁知道从 MyISAM 更改为 MyinnoDB 只是为了跟上 MySQL 的具体原因。
如果我可以继续使用适合我自己的特定用途的东西,那么当有更紧迫的问题需要注意但现在有问题时,我认为没有理由担心测试和可能的错误。MyISAM 目前没有问题。
在过去的 3 周中,我们的 MySQL 服务器一直存在瓶颈问题。我一直在使用 MonYOG 来查看进程列表,试图了解这些问题。我们知道我们在代码中运行的一些查询和进程没有得到优化,但我并不完全相信这是我们问题的主要来源。我觉得我们的服务器应该能够克服这些问题。
我们的表混合了 innodb 和 myISAM。我绝不是 DBA,也不会假装是 DBA,所以我不确定在我们当前的环境中哪种引擎是最好的。我们的阅读量很大,但也混合了大量更新和插入内容。我看到很多锁定的表,这让我认为 innodb 可能更好,因为它执行行锁而不是表锁。我将我们的一些表从 MyISAM 转换为 innodb 以利用一些可用的设置。开发人员也在使用大量复杂的连接。
这是我们在 my.cnf 中运行的内容:
[mysqld]
datadir=/var/lib/mysql
port=3306
socket=/var/lib/mysql/mysql.sock
user=mysql
key_buffer_size=512M
innodb_file_per_table
innodb_buffer_pool_size=6GB
#the following line is causing some odd errors when doing db dump
#innodb_log_file_size=128M
innodb_log_buffer_size=8M
innodb_additional_mem_pool_size=32M
max_allowed_packet=16M
join_buffer_size=8M
sort_buffer_size=8M
max_connections=500
wait_timeout=500
skip-name-resolve
thread_cache=256
table_cache=256
tmp_table_size=48M
max_heap_table_size=48M
query_cache_size=64M
#logging of slow queries
log-slow-queries=/var/log/mysql-slow-query.log
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility …Run Code Online (Sandbox Code Playgroud) 我在此页面上阅读了以下内容
http://dev.mysql.com/doc/mysql/en/server-system-variables.html
bulk_insert_buffer_size MyISAM 使用特殊的树状缓存来使 INSERT ... SELECT、INSERT ... VALUES (...)、(...)、... 和 LOAD DATA INFILE 的批量插入更快。此变量以每个线程的字节数限制缓存树的大小。将其设置为 0 将禁用此优化。注意:此缓存仅在向非空表添加数据时使用。默认值为 8MB。这个变量是在 MySQL 4.0.3 中添加的。这个变量以前被命名为 myisam_bulk_insert_tree_size。
我认为这意味着 bulk_insert_buffer_size 对 InnoDB 表没有影响,只对 MyISAM 表有影响。这样对吗?
以下是有关需要更改的表格的更多信息:
向这样的大表添加几个新列(最少 2 列)的最佳方法是什么?停机时间最短。如果不是一两天的话,仅使用直接的 ALTER 表命令将需要数小时才能完成。
附加问题:如果新列默认值设置为 NULL 而不是“预定义”值,它会影响添加新列所需的时间长度吗?
在工作中,我们遇到了一个问题,现在已经发生了不止一次。
问题是查询处于将 HEAP 转换为 MyISAM 的状态并且它使我们的服务器瘫痪(在这种状态下的查询无法自我终止,并且只有在我们的案例中似乎需要 FOREVER 的操作之后才会评估终止标志)
以下全局 MYSQL 变量出现在我们面前:
| tmp_table_size | 17179869184 |
| max_heap_table_size | 8589934592 |
Run Code Online (Sandbox Code Playgroud)
任何想法我们应该做什么?
我们是否应该调整 tmp_table_size 和 max_heap_table_size 的大小以具有相同的值?
那会有帮助吗?
我有一台服务器,可以接收来自世界各地数千个地点的数据。该服务器定期连接到我的数据库服务器并快速连续插入记录,一次一行。最多可以有 6 个这样的进程 (perl) 同时运行,每个进程可能有超过 50,000 个插入语句,随后,表被锁定。
我想弄清楚是什么导致锁定?我是否最好创建一个多插入,比如,一次 100 行,然后首尾相连?我用什么作为指导方针?
DB 服务器有 100GB RAM 和 12 个处理器。它很少使用,但是当这些插入内容出现时,每个人都会冻结几分钟,这会干扰人们运行报告等。
感谢您的任何建议。我知道我需要错开插入,我只是问什么是推荐的方法来做到这一点。
myisam ×10
mysql ×9
innodb ×3
performance ×2
alter-table ×1
backup ×1
insert ×1
locking ×1
memory ×1