我有一个带有 VARCHAR(20) 列的大表,我需要将其修改为 VARCHAR(50) 列。通常,在此特定表上执行 ALTER TABLE(添加 TINYINT)大约需要 90-120 分钟才能完成,因此我实际上只能在周六或周日晚上执行此操作以避免影响数据库的用户。如果可能,我想在此之前进行此修改。
该列也被索引,我认为这会使 ALTER TABLE 变慢,因为它必须在修改列长度后重建索引。
Web 应用程序设置在 MySQL 复制环境中(26 个从站和一个主站)。我记得曾经在某处读到过一种方法是首先在每个从站上执行 ALTER TABLE(最大限度地减少对用户的影响),然后在主站上执行此操作,但那不会尝试将 ALTER TABLE 命令复制到从站吗?
所以我的问题是:对我来说,在对用户的干扰最小的情况下修改此表的最佳方法是什么?
编辑:该表是 InnoDB。
我需要对聚集索引做一个简短的解释。
INFORMATION_SCHEMA 理论上是 SQL 标准中指定的一组视图,允许用户检查系统的元数据。这是如何在 MySQL 中实现的?
当我连接到全新安装时,我看到两个数据库:mysql和information_schema. 在数据库SHOW CREATE TABLE上使用语句后information_schema,它看起来不是作为一组视图实现的,而是使用基表实现的。这个假设正确吗?或者还有其他对用户隐藏的系统表?
我从未涉足 MySQL 集群,想知道它如何使我受益。什么时候使用它最好,它是否有性能优势?
所以我有一个在复制流上设置的测试数据库服务器。在名称上出现了一个优化,它迅速填满了 slaves 数据目录上的空间。Mysql 尽职尽责地等待更多空间。
这个 datadir 是一个文件系统,只用作 mysql 的 datadir,所以没有其他东西可以释放。
我有一个 4 g innodb 测试表,它不是复制流的一部分,所以我想我会尝试一些东西来看看它是否有效,作为一个测试环境,如果事情出现严重错误,我并不太担心。
这是我采取的步骤
.err 日志中没有显示任何内容,看起来不错。我连接并使用 mydb;并查看我在展示表中弄乱的表。但是,如果我尝试
select * from testtable limit 10;
Run Code Online (Sandbox Code Playgroud)
我收到错误
ERROR 1146 (42S02): Table 'mydb.testtable' doesn't exist
Run Code Online (Sandbox Code Playgroud)
到目前为止,我可以从所有其他表中读取数据,并且复制开始备份,没有任何抱怨。
我能做些什么来从这一点上恢复过来吗?如果需要,我可以从头开始重建它,但很好奇其他人对这次冒险的总体看法。我采取的一系列步骤是否有任何结果会导致更完美的结果?
如果这不是一个测试服务器,我不能只是“实时运行”看看会发生什么?如果我不得不喜欢,有什么最好的方法可以暂时释放生产从站上的空间?
我对数据库管理很陌生。
我在设置mysql主从复制时遇到了很多问题。
我还面临常规的 mysql 复制故障排除问题。
任何人都可以帮助理解我应该如何处理所有这些吗?
仅考虑性能,MySQL Cluster 能否击败自定义数据分片 MySQL 解决方案?分片 = 水平分区
当我提到分片时,我正在考虑在应用层进行分片,例如,在独立的 MySQL 实例之间均匀分布记录。对于两台服务器,它可能是 (key mod 2)。
我有一个要更改的 InnoDB 表。该表有大约 80M 行,并退出了一些索引。
我想更改其中一列的名称并添加更多索引。
alter table,最快的解决方案吗?这个时候,我只关心速度 :)
我运行一个EXPLAIN:
mysql> explain select last_name from employees order by last_name;
+----+-------------+-----------+------+---------------+------+---------+------+-------+----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------+------+---------------+------+---------+------+-------+----------------+
| 1 | SIMPLE | employees | ALL | NULL | NULL | NULL | NULL | 10031 | Using filesort |
+----+-------------+-----------+------+---------------+------+---------+------+-------+----------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
我表中的索引:
mysql> show index from employees;
+-----------+------------+---------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | …Run Code Online (Sandbox Code Playgroud) 我正在尝试使 mysql 客户端连接到 mysql 服务器,而无需以交互方式提供密码。采取的步骤:
1)首先创建一个mylogin.cnf文件
$ mysql_config_editor set --user=<user> --password --host=<host>
Enter password:
Run Code Online (Sandbox Code Playgroud)
2)文件创建成功:
$ ls -la .mylogin.cnf
-rw-------. 1 urmt urmt 136 Dec 19 11:01 .mylogin.cnf
$ mysql_config_editor print --all
[client]
user = <user>
password = *****
host = <host>
Run Code Online (Sandbox Code Playgroud)
3)使用mysql客户端连接
$ mysql <dbname>
ERROR 1045 (28000): Access denied for user '<user>'@'<host>' (using password: NO)
Run Code Online (Sandbox Code Playgroud)
某处是否有默认值/配置使客户端忽略 mylogin.cnf 中的密码?从文件中正确读取了用户和主机属性。
如果我在命令行上提供密码,我就可以正常连接:
$ mysql -p <dbname>
Enter password:
Reading table information...
...
mysql>
Run Code Online (Sandbox Code Playgroud)
MySQL 客户端版本为 5.6.22,MySQL Server 版本为 5.6.22,均在 Oracle Linux …
mysql ×9
innodb ×4
alter-table ×2
index ×2
ndbcluster ×2
replication ×2
ddl ×1
disk-space ×1
explain ×1
my.cnf ×1
mysql-5 ×1
mysql-5.6 ×1
optimization ×1
password ×1
sql-server ×1