如何将 MySQL 表从一台物理服务器移动到另一台物理服务器?
例如这个确切的场景: 我有一个使用 innodb 表的 MySQL 服务器,大小约为 20GB。
我想将其移至新服务器,最有效的方法是什么?
我真的需要一些 mysql 专业知识。我是 mysql 的新手,在过去的 1 周内,我看到我的数据库发生了一些服务器崩溃。
我在 Ubuntu 上使用 mysql 5.1.36。这是一个专用的 mysql 服务器,具有双核和 4GB 内存和 40GB SSD。
日志错误是:
120413 23:57:15 [Note] Plugin 'FEDERATED' is disabled.
120413 23:57:15 [Warning] option 'innodb-autoextend-increment': unsigned value 2000 adjusted to 1000
120413 23:57:15 InnoDB: Initializing buffer pool, size = 2.9G
120413 23:57:15 InnoDB: Completed initialization of buffer pool
120413 23:57:16 InnoDB: Started; log sequence number 0 44234
120413 23:57:16 [Note] Event Scheduler: Loaded 0 events
120413 23:57:16 [Note] /usr/sbin/mysqld: ready for connections.
Version: '5.1.58-1ubuntu1-log' …Run Code Online (Sandbox Code Playgroud) 我在 mysql 中收到此警告,
[Warning] Aborted connection 21 to db: 'MyDB' user: 'MyUser' host: 'localhost' (Got an error reading communication packets)
Run Code Online (Sandbox Code Playgroud)
我经历过谷歌几个主题,并根据一些建议,我增加了max_allowed_packet从128 to 512 to 1024仍然相同的行为。
我使用的Drupal 7,和是有很多BLOB数据类型的,但1024 Mb的max_allowed_packet应该是足够的在我看来。
任何其他解决方法如何克服此警告?
编辑:
添加了一些设置作为@Rolando 的建议/答案,我仍然收到相同的警告。
我的 mysql 配置如下所示:
[client]
port = 3306
socket = /tmp/mysql.sock
default-character-set = utf8
[mysqld]
port = 3306
socket = /tmp/mysql.sock
skip-external-locking
key_buffer_size = 16K
max_allowed_packet = 1024M
table_open_cache = 128
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length …Run Code Online (Sandbox Code Playgroud) 我正在开发一个涉及大量数据库写入的应用程序,大约 70% 的插入和 30% 的读取。这个比率还包括我认为是一次读取和一次写入的更新。通过插入语句,多个客户端通过下面的插入语句在数据库中插入数据:
$mysqli->prepare("INSERT INTO `track` (user, uniq_name, ad_name, ad_delay_time ) values (?, ?, ?, ?)");
Run Code Online (Sandbox Code Playgroud)
问题是我应该使用insert_delay还是使用mysqli_multi_query机制,因为 insert 语句在服务器上使用 ~100% cpu。我在我的数据库上使用 InnoDB 引擎,所以插入延迟是不可能的。服务器上的插入是 ~36k/hr 和 99.89% 读取,我也在使用 select 语句在单个查询中检索数据七次,这个查询在服务器上执行需要 150 秒。我可以使用什么样的技术或机制来完成这项任务?我的服务器内存是 2 GB,我应该扩展内存吗?。看看这个问题,任何建议将不胜感激。
表的结构:
+-----------------+--------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+--------------+------+-----+-------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| user | varchar(100) | NO | | NULL | …Run Code Online (Sandbox Code Playgroud) 您好,我正在运行最新版本的 Percona Server。
服务器版本:5.5.24-55 Percona Server (GPL),26.0 版
我有一个10个cpu的盒子有这些特点。
processor : 0
vendor_id : AuthenticAMD
cpu family : 16
model : 9
model name : AMD Opteron(tm) Processor 6128
stepping : 1
microcode : 0x10000d9
cpu MHz : 800.000
cache size : 512 KB
Run Code Online (Sandbox Code Playgroud)
它具有 SSD 和 64GB 的 RAM。Innodb 大约为 10GB,因此 innodb_buffer_pool_size 设置为 10GB。
我有一张如下表:
create table TODAY
( symbol_id integer not null
, openp decimal(10,4)
, high decimal(10,4)
, low decimal(10,4)
, last decimal(10,4) not null
, volume …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) 我在 MySQL innoDB 中有大约 12 个表,其中一个有 1100 万条记录。
我用这个命令来备份:
mysqldump -u [USERNAME] -p [DBNAME] | gzip > [/path_to_file/DBNAME].sql.gz
Run Code Online (Sandbox Code Playgroud)
此命令用于在新服务器上导入内容:
USE [DBNAME];
SOURCE [/path_to_file/DBNAME].sql;
Run Code Online (Sandbox Code Playgroud)
这是我所遭受的痛苦(每个查询的时间都在增加!):

我可以做些什么来加快速度?我的 mysqldump 命令有问题吗?
我有一个几乎从不查询的数据包日志数据库。它只需要快速插入即可。我使用 InnoDB 是因为我想保持 ACID 合规性,因为即使丢失一个数据包也可能对我们的客户造成损害。在性能调优方案中,我通过多个数据库连接向服务器发送 1,000,000 个数据包。但是无论我在 my.cnf 中使用什么设置,我都无法让 mysqld 进程在 12 核的系统上使用超过 900% 的 CPU。(盒子上没有其他东西在运行。)
我设置了以下内容
innodb_file_per_table = 1innodb_write_io_threads = 64innodb_read_io_threads = 64innodb_thread_concurrency = 0如果我使用 MyISAM,我可以在大约 6 秒内写入所有数据包。但是 InnoDB 大约需要 25。我可以让 MySQL 使用剩余的系统资源并更快地插入吗?
编辑:这是表的架构:
+-------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------------------+------+-----+---------+-------+
| t | bigint(20) unsigned | YES | | NULL | |
| a | char(1) | YES | | NULL | |
| sa | …Run Code Online (Sandbox Code Playgroud) 再会。
我知道这可能是其他问题的重复,但是我已经在许多线程中应用了所有建议,但我仍然遇到同样的问题。
我有一个使用 max 的存储过程3 tables。当我运行该程序时,只30% of my CPU使用了大约25% of RAM.
我坐在一个CPU with 4 cores and 16GB RAM.
my.ini 如下所示:
[client]
port = 3306
socket = /tmp/mysql.sock
[mysqld]
port = 3306
socket = /tmp/mysql.sock
skip-external-locking
key_buffer_size = 512M
max_allowed_packet = 32M
table_open_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 128M
thread_cache_size = 16
query_cache_size= 32M
thread_concurrency = 0
log-bin=mysql-bin
binlog_format=mixed
server-id = 1
innodb_buffer_pool_size = 12G …Run Code Online (Sandbox Code Playgroud) 我有一个 8 核 MySQL 服务器,32 GB RAM,保存 40 个 MyISAM 表(总计:~4GB 数据)。由于数据库大小比可用内存小几倍,我如何才能充分利用我的服务器资源?
我应该尝试在 my.cnf 中配置哪些设置?
我可以强制数据 + 索引留在内存中吗?