Mysql的奇技巧淫

Posted by Zeusro on June 23, 2018
👈🏻 Select language

image

慢查询优化基本步骤

  1. 先运行看看是否真的很慢,注意设置SQL_NO_CACHE
  2. where条件单表查,锁定最小返回记录表。这句话的意思是把查询语句的where都应用到表中返回的记录数最小的表开始查起,单表每个字段分别查询,看哪个字段的区分度最高
  3. explain查看执行计划,是否与1预期一致(从锁定记录较少的表开始查询)
  4. order by limit 形式的sql语句让排序的表优先查
  5. 了解业务方使用场景
  6. 加索引时参照建索引的几大原则
  7. 观察结果,不符合预期继续从0分析

mysql查询技巧

分析查询

1
explain  select sleep(1);
  • explain 可以分析查询语句的性能
  • sleep秒

变量赋值

1
2
set @current =0;
select @current :=@current +1;
  • 在查询中可以通过使用:=对变量进行重新赋值

查看数据库大小

1
2
3
4
SELECT table_schema 'DB Name',
        ROUND(SUM(data_length + index_length) / 1024 / 1024, 1)   MB
FROM information_schema.tables
GROUP BY table_schema order by MB desc;

utf-8的表里面搜索带中文的数据

1
select number from Chinese_Test where HEX(contents) REGEXP '^(..)*(E[4-9])';

the Chinese Character is from E4 to E9

一些套路

不要使用”utf-8”

utf-8不是真正的UTF-8,应该使用utf8mb4作为替代。系统中有一个参数character_set_server,改为utf8mb4

显示数据库引擎

1
SELECT * FROM INFORMATION_SCHEMA.ENGINES;

显示长事务

1
select * from information_schema.innodb_trx;

暴力改表

改表期间,运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT 
    CONCAT('kill ', thread_id, ';')
FROM
    (SELECT DISTINCT
        (i.trx_mysql_thread_id) thread_id
    FROM
        information_schema.innodb_trx i, (SELECT 
        id, time
    FROM
        information_schema.processlist
    WHERE
        time = (SELECT 
                MAX(time)
            FROM
                information_schema.processlist
            WHERE
                state = 'Waiting for table metadata lock'
                    AND SUBSTRING(info, 1, 5) IN ('alter' , 'optim', 'repai', 'lock ', 'drop ', 'creat'))) p
    WHERE
        TIMESTAMPDIFF(SECOND, i.trx_started, NOW()) > p.time
            AND i.trx_mysql_thread_id NOT IN (CONNECTION_ID() , p.id)) t;

执行 alter 的同时, kill 掉除了 select * from INFORMATION_SCHEMA.innodb_trx里面除了 alter 以外的进程

PS:虽然mysql 5.7支持onlineDDL,但是实测修改数据类型的时候不支持DML.这个时候可以考虑使用pt-online-schema-change,例子见pt-online-schema-change使用说明、限制与比较

参考: pt-online-schema-change的原理解析与应用说明

允许 mysql 远程访问

1
2
3
4
5
vi /etc/mysql/my.cnf
```
[mysqld]
bind-address    = 0.0.0.0
```

修改大数据表

  1. 被修改的表 Table A 需要有一个记录时间戳的字段, 这个时间戳就是每次数据更新,都会更新的字段, 这个字段需要有索引,在django里可以使用 auto_now=True
  2. 创建一个新的临时表 Table B, 不是tmp_table, 是一个新的表,但是是临时使用的。 这个表和要修改的表拥有一模一样的数据结构, 加上你要修改的部分, 比如增加的字段;
  3. 记录下Table A 的索引
  4. 删除 Table B 的全部索引
  5. 把Table A 的数据全部复制到Table B, 是不是执行 INSERT INTO B(field1, field2) SELECT field1, field2 FROM A? 当然不是, 这么做不还是锁死了Table A 么, 这里的迁移就是一个需要细分的地方,需要写一个脚本, 让程序每次读取比如5000条数据出来, 插入到Table B里面, 因为Table B 是没有索引的, 所以要当心不要使用多进程来做; 如果是多进程, 要确保插入到B的时候是不会有重复数据的; 如果是1000万的数据,每次5000条, 假设这个操作需要500ms, 那么 2000*200ms = 16 分钟。 这只是一个估值, 具体情况和服务器当时的情况有关, 不好细说。 另外, 我们要记录这个迁移开始的时间点,记为t1; 5 为B建立索引, 待索引全部好了之后, 再继续6
  6. 那么这个时候Table A 的数据是不是都进入了Table B 呢, 应当说差不多大部分都进入了, 但5中说, 这大概需要16分钟, 这么长的时间里, 可能有新的数据进入了, 也有可能已有的数据发生了更新, 所以我们要把Table A 中在t1 之后发生变化的数据查找出来, 然后更新到Table B 中, 我们的做法是:
    1
    2
    3
    4
    5
    
     记录这个操作对应的时间点 t2
     BEGIN;
     DELETE FROM B WHERE updated_time > t1;
     INSERT INTO B(field1, field2) SELECT field1, field2 FROM A WHERE updated_time >t1;
     COMMIT;
    
  7. 现在A 和 B 差不多該同步了吧? 差不多了, 但是6 执行完之后, A仍然在写, 子子孙孙无穷尽也 … , 但这个时候 A 和 B 的差异已经非常非常小了, 所以在下一步,我们在一个transaction 里执行下面的操作:
    1
    2
    3
    4
    5
    6
    7
    
     BEGIN;
     DELETE FROM B WHERE updated_time > t2;
     INSERT INTO B(field1, field2) SELECT field1, field2 FROM A WHERE updated_time >t2;
    
     ALTER TABLE A RENAME TO C;
     ALTER TABLE B RENAME TO A;
     COMMIT;
    

MySQL Workbech

允许update不where更新

1
SET SQL_SAFE_UPDATES = 0;

客户端提示

1
2
3
4
Error Code: 2013. Lost connection to MySQL server during query
Error Code: 2006. MySQL server has gone away

Go to Edit -> Preferences -> SQL Editor and set to a higher value this parameter: DBMS connection read time out (in seconds). For instance: 86400.

修改为F5执行选中当前选中语句

方法:修改C:\Program Files\MySQL\MySQL Workbench 6.3 CE\data\main_menu.xml里面的内容

1
2
3
4
5
6
7
8
9
10
        <value type="object" struct-name="app.MenuItem" id="com.mysql.wb.menu.query.execute_current_statementwin"> 
          <link type="object" key="owner" struct-name="app.MenuItem">com.mysql.wb.menu.query</link> 
          <value type="string" key="caption">Execute Current Statement</value> 
          <value type="string" key="name">query.execute_current_statement</value> 
          <value type="string" key="command">builtin:query.execute_current_statement</value> 
          <value type="string" key="itemType">action</value> 
          <value type="string" key="shortcut">F5</value>
          <value type="string" key="platform">windows</value>
        </value> 

故障处理

忘记密码

  • mysql 5.7 Ubuntu 64
1
2
3
4
5
sudo service mysql status
sudo service mysql stop
mkdir -p /var/run/mysqld
chown mysql:mysql /var/run/mysqld
sudo mysqld_safe --skip-grant-tables --skip-networking &  
1
mysql -u root --socket=/tmp/mysql.sock
1
2
3
use mysql; 
update user set authentication_string=PASSWORD("aaaaaaaaaaa") where User='root';
flush privileges;
1
sudo service mysql restart

磁盘已满

阿里云的RDS,磁盘满了,会出现 --rds-read-drop-only 状态。此时只能读取数据或者删库(毕竟升级磁盘要重启)。

此时最快的解决办法是删库。

退而求其次,转移数据库,然后删库。

或者在业务低峰期优化数据表结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT 
    ROW_FORMAT,
    TABLE_ROWS,
    DATA_LENGTH,
    INDEX_LENGTH,
    MAX_DATA_LENGTH,
    DATA_FREE,
    TABLE_SCHEMA,
    TABLE_NAME,
    ENGINE
FROM
    information_schema.TABLES
    order by data_free desc, TABLE_NAME

OPTIMIZE TABLE  db.tables

释放那些无效的空间

参考链接

  1. Table Locking Issues
  2. privileges-provided
  3. RDS MySQL 表上 Metadata lock 的产生和处理
  4. MySQL出现Waiting for table metadata lock的原因以及解决方法
  5. How to Allow Remote MySQL Database Connection
  6. 解决Lost connection to MySQL server during query错误方法
  7. mysql的show processlist命令大作用
  8. Privileges Provided by MySQL
  9. 记住,永远不要在MySQL中使用“utf8”
  10. MySQL索引原理及慢查询优化
  11. Mysql 如何修改大数据表
  12. MySQL 二进制日志(Binary Log)
  13. how-to-get-size-of-mysql-database
  14. How to detect rows with chinese characters in MySQL?
  15. 云数据库 RDS 版 > 技术运维问题 > MYSQL使用
  16. mysql: show processlist 详解
  17. MySQL SHOW PROCESSLIST协助故障诊断
  18. 解决mysqld_safe Directory ‘/var/run/mysqld’ for UNIX socket file don’t exists
  19. MySQL5.7更改密码时出现ERROR 1054 (42S22): Unknown column ‘password’ in ‘field list’
  20. create-user
  21. GRANT
  22. privileges-provided
  23. MySQL用户管理:添加用户、授权、删除用户
  24. 详解慢查询
  25. MySQL 数据库优化,看这篇就够了

阿里云

  1. 参数调优建议
  2. 10分钟搭建MySQL Binlog分析+可视化方案
  3. 如何排查MySQL实例空间满后自动锁定的原因

image

Basic Steps for Slow Query Optimization

  1. Run it first to see if it’s really slow, note setting SQL_NO_CACHE
  2. Single-table query with where conditions, lock the table with minimum returned records. This means applying all where clauses from the query statement starting from the table with the smallest number of returned records, query each field of the single table separately, and see which field has the highest distinctiveness
  3. Use explain to view the execution plan, whether it matches expectation 1 (query starting from the table with fewer locked records)
  4. For SQL statements in the form of order by limit, prioritize querying the sorted table
  5. Understand the business usage scenario
  6. When adding indexes, refer to the major principles of index creation
  7. Observe results, if not meeting expectations, continue analyzing from 0

MySQL Query Tips

Analyze Queries

1
explain  select sleep(1);
  • explain can analyze query statement performance
  • sleep seconds

Variable Assignment

1
2
set @current =0;
select @current :=@current +1;
  • In queries, you can reassign variables using :=

View Database Size

1
2
3
4
SELECT table_schema 'DB Name',
        ROUND(SUM(data_length + index_length) / 1024 / 1024, 1)   MB
FROM information_schema.tables
GROUP BY table_schema order by MB desc;

Search for Chinese Data in utf-8 Tables

1
select number from Chinese_Test where HEX(contents) REGEXP '^(..)*(E[4-9])';

the Chinese Character is from E4 to E9

Some Tricks

Don’t Use “utf-8”

utf-8 is not true UTF-8, should use utf8mb4 as replacement. There’s a parameter character_set_server in the system, change it to utf8mb4

Display Database Engines

1
SELECT * FROM INFORMATION_SCHEMA.ENGINES;

Display Long Transactions

1
select * from information_schema.innodb_trx;

Force Table Modification

During table modification, run:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT 
    CONCAT('kill ', thread_id, ';')
FROM
    (SELECT DISTINCT
        (i.trx_mysql_thread_id) thread_id
    FROM
        information_schema.innodb_trx i, (SELECT 
        id, time
    FROM
        information_schema.processlist
    WHERE
        time = (SELECT 
                MAX(time)
            FROM
                information_schema.processlist
            WHERE
                state = 'Waiting for table metadata lock'
                    AND SUBSTRING(info, 1, 5) IN ('alter' , 'optim', 'repai', 'lock ', 'drop ', 'creat'))) p
    WHERE
        TIMESTAMPDIFF(SECOND, i.trx_started, NOW()) > p.time
            AND i.trx_mysql_thread_id NOT IN (CONNECTION_ID() , p.id)) t;

While executing alter, kill processes other than select * from INFORMATION_SCHEMA.innodb_trx except alter

PS: Although mysql 5.7 supports onlineDDL, in practice modifying data types doesn’t support DML. At this time, consider using pt-online-schema-change, see example at pt-online-schema-change Usage, Limitations and Comparison

Reference: pt-online-schema-change Principle Analysis and Application Explanation

Allow MySQL Remote Access

1
2
3
4
5
vi /etc/mysql/my.cnf
```
[mysqld]
bind-address    = 0.0.0.0
```

Modify Large Data Tables

  1. The table to be modified Table A needs a field that records timestamps. This timestamp is a field that updates every time data is updated. This field needs an index. In django, you can use auto_now=True
  2. Create a new temporary table Table B, not tmp_table, but a new table that’s temporarily used. This table has the exact same data structure as the table to be modified, plus the parts you want to modify, such as added fields;
  3. Record Table A’s indexes
  4. Delete all indexes from Table B
  5. Copy all data from Table A to Table B. Should we execute INSERT INTO B(field1, field2) SELECT field1, field2 FROM A? Of course not, wouldn’t that still lock Table A? The migration here is a place that needs subdivision. Write a script to have the program read, say, 5000 records at a time, and insert them into Table B. Because Table B has no indexes, be careful not to use multi-process; if multi-process, ensure there’s no duplicate data when inserting into B; if it’s 10 million records, 5000 at a time, assuming this operation takes 500ms, then 2000*200ms = 16 minutes. This is just an estimate, specific situations depend on the server’s condition at the time, hard to detail. Also, we need to record the time point when this migration starts, denoted as t1;
  6. Build indexes for B, wait until all indexes are ready, then continue with 6
  7. So at this point, has all Table A’s data entered Table B? Should say most of it has, but as mentioned in 5, this takes about 16 minutes. In such a long time, new data may have entered, or existing data may have been updated. So we need to find data in Table A that changed after t1, then update it to Table B. Our approach is:
    1
    2
    3
    4
    5
    
     Record the time point corresponding to this operation t2
     BEGIN;
     DELETE FROM B WHERE updated_time > t1;
     INSERT INTO B(field1, field2) SELECT field1, field2 FROM A WHERE updated_time >t1;
     COMMIT;
    
  8. Now A and B should be pretty much synced, right? Pretty much, but after 6 executes, A is still writing, descendants endless… But at this point, the difference between A and B is very, very small. So in the next step, we execute the following operations in a transaction:
    1
    2
    3
    4
    5
    6
    7
    
     BEGIN;
     DELETE FROM B WHERE updated_time > t2;
     INSERT INTO B(field1, field2) SELECT field1, field2 FROM A WHERE updated_time >t2;
    
     ALTER TABLE A RENAME TO C;
     ALTER TABLE B RENAME TO A;
     COMMIT;
    

MySQL Workbench

Allow update without where

1
SET SQL_SAFE_UPDATES = 0;

Client Tips

1
2
3
4
Error Code: 2013. Lost connection to MySQL server during query
Error Code: 2006. MySQL server has gone away

Go to Edit -> Preferences -> SQL Editor and set to a higher value this parameter: DBMS connection read time out (in seconds). For instance: 86400.

Change to F5 Execute Currently Selected Statement

Method: Modify content in C:\Program Files\MySQL\MySQL Workbench 6.3 CE\data\main_menu.xml

1
2
3
4
5
6
7
8
9
10
        <value type="object" struct-name="app.MenuItem" id="com.mysql.wb.menu.query.execute_current_statementwin"> 
          <link type="object" key="owner" struct-name="app.MenuItem">com.mysql.wb.menu.query</link> 
          <value type="string" key="caption">Execute Current Statement</value> 
          <value type="string" key="name">query.execute_current_statement</value> 
          <value type="string" key="command">builtin:query.execute_current_statement</value> 
          <value type="string" key="itemType">action</value> 
          <value type="string" key="shortcut">F5</value>
          <value type="string" key="platform">windows</value>
        </value> 

Troubleshooting

Forgot Password

  • mysql 5.7 Ubuntu 64
1
2
3
4
5
sudo service mysql status
sudo service mysql stop
mkdir -p /var/run/mysqld
chown mysql:mysql /var/run/mysqld
sudo mysqld_safe --skip-grant-tables --skip-networking &  
1
mysql -u root --socket=/tmp/mysql.sock
1
2
3
use mysql; 
update user set authentication_string=PASSWORD("aaaaaaaaaaa") where User='root';
flush privileges;
1
sudo service mysql restart

Disk Full

Alibaba Cloud’s RDS, when the disk is full, will show --rds-read-drop-only status. At this time, you can only read data or delete the database (after all, upgrading the disk requires a restart).

The fastest solution at this time is to delete the database.

Second best, transfer the database, then delete it.

Or optimize the data table structure during business low periods

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT 
    ROW_FORMAT,
    TABLE_ROWS,
    DATA_LENGTH,
    INDEX_LENGTH,
    MAX_DATA_LENGTH,
    DATA_FREE,
    TABLE_SCHEMA,
    TABLE_NAME,
    ENGINE
FROM
    information_schema.TABLES
    order by data_free desc, TABLE_NAME

OPTIMIZE TABLE  db.tables

Release those invalid spaces

References

  1. Table Locking Issues
  2. privileges-provided
  3. RDS MySQL Metadata Lock Generation and Handling on Tables
  4. MySQL Waiting for table metadata lock Causes and Solutions
  5. How to Allow Remote MySQL Database Connection
  6. Solving Lost connection to MySQL server during query Error Method
  7. mysql show processlist Command Great Use
  8. Privileges Provided by MySQL
  9. Remember, Never Use “utf8” in MySQL
  10. MySQL Index Principles and Slow Query Optimization
  11. How to Modify Large Data Tables in Mysql
  12. MySQL Binary Log (Binary Log)
  13. how-to-get-size-of-mysql-database
  14. How to detect rows with chinese characters in MySQL?
  15. Cloud Database RDS Edition > Technical Operations Issues > MYSQL Usage
  16. mysql: show processlist Detailed Explanation
  17. MySQL SHOW PROCESSLIST Assists Troubleshooting
  18. Solving mysqld_safe Directory ‘/var/run/mysqld’ for UNIX socket file don’t exists
  19. MySQL5.7 Error 1054 (42S22): Unknown column ‘password’ in ‘field list’ When Changing Password
  20. create-user
  21. GRANT
  22. privileges-provided
  23. MySQL User Management: Add Users, Grant Permissions, Delete Users
  24. Detailed Explanation of Slow Queries
  25. MySQL Database Optimization, This Article is Enough

Alibaba Cloud

  1. Parameter Tuning Suggestions
  2. 10 Minutes to Build MySQL Binlog Analysis + Visualization Solution
  3. How to Troubleshoot MySQL Instance Space Full Auto-Lock Causes

image

Основные шаги оптимизации медленных запросов

  1. Сначала запустите, чтобы увидеть, действительно ли это медленно, обратите внимание на установку SQL_NO_CACHE
  2. Запрос к одной таблице с условиями where, заблокируйте таблицу с минимальным количеством возвращённых записей. Это означает применение всех предложений where из запроса, начиная с таблицы с наименьшим количеством возвращённых записей, отдельный запрос каждого поля одной таблицы, чтобы увидеть, какое поле имеет наивысшую различимость
  3. Используйте explain для просмотра плана выполнения, соответствует ли он ожиданию 1 (запрос, начинающийся с таблицы с меньшим количеством заблокированных записей)
  4. Для SQL-запросов в форме order by limit дайте приоритет запросу отсортированной таблицы
  5. Поймите сценарий использования бизнеса
  6. При добавлении индексов обращайтесь к основным принципам создания индексов
  7. Наблюдайте результаты, если не соответствует ожиданиям, продолжайте анализ с 0

Советы по запросам MySQL

Анализ запросов

1
explain  select sleep(1);
  • explain может анализировать производительность запроса
  • sleep секунд

Присвоение переменных

1
2
set @current =0;
select @current :=@current +1;
  • В запросах вы можете переназначить переменные, используя :=

Просмотр размера базы данных

1
2
3
4
SELECT table_schema 'DB Name',
        ROUND(SUM(data_length + index_length) / 1024 / 1024, 1)   MB
FROM information_schema.tables
GROUP BY table_schema order by MB desc;

Поиск китайских данных в таблицах utf-8

1
select number from Chinese_Test where HEX(contents) REGEXP '^(..)*(E[4-9])';

китайские символы от E4 до E9

Некоторые приёмы

Не используйте “utf-8”

utf-8 — это не настоящий UTF-8, следует использовать utf8mb4 в качестве замены. В системе есть параметр character_set_server, измените его на utf8mb4

Отображение движков базы данных

1
SELECT * FROM INFORMATION_SCHEMA.ENGINES;

Отображение длинных транзакций

1
select * from information_schema.innodb_trx;

Принудительное изменение таблицы

Во время изменения таблицы выполните:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT 
    CONCAT('kill ', thread_id, ';')
FROM
    (SELECT DISTINCT
        (i.trx_mysql_thread_id) thread_id
    FROM
        information_schema.innodb_trx i, (SELECT 
        id, time
    FROM
        information_schema.processlist
    WHERE
        time = (SELECT 
                MAX(time)
            FROM
                information_schema.processlist
            WHERE
                state = 'Waiting for table metadata lock'
                    AND SUBSTRING(info, 1, 5) IN ('alter' , 'optim', 'repai', 'lock ', 'drop ', 'creat'))) p
    WHERE
        TIMESTAMPDIFF(SECOND, i.trx_started, NOW()) > p.time
            AND i.trx_mysql_thread_id NOT IN (CONNECTION_ID() , p.id)) t;

При выполнении alter убивайте процессы, кроме select * from INFORMATION_SCHEMA.innodb_trx, кроме alter

PS: Хотя mysql 5.7 поддерживает onlineDDL, на практике изменение типов данных не поддерживает DML. В это время можно рассмотреть использование pt-online-schema-change, пример см. в pt-online-schema-change Инструкция по использованию, ограничения и сравнение

Ссылка: Анализ принципов pt-online-schema-change и объяснение применения

Разрешить удалённый доступ к MySQL

1
2
3
4
5
vi /etc/mysql/my.cnf
```
[mysqld]
bind-address    = 0.0.0.0
```

Изменение больших таблиц данных

  1. Таблица для изменения Table A нуждается в поле, которое записывает временные метки. Эта временная метка — это поле, которое обновляется каждый раз при обновлении данных. Это поле нуждается в индексе. В django вы можете использовать auto_now=True
  2. Создайте новую временную таблицу Table B, не tmp_table, а новую таблицу, которая временно используется. Эта таблица имеет точно такую же структуру данных, как таблица для изменения, плюс части, которые вы хотите изменить, такие как добавленные поля;
  3. Запишите индексы Table A
  4. Удалите все индексы из Table B
  5. Скопируйте все данные из Table A в Table B. Должны ли мы выполнить INSERT INTO B(field1, field2) SELECT field1, field2 FROM A? Конечно нет, разве это не заблокирует Table A? Миграция здесь — это место, которое требует подразделения. Напишите скрипт, чтобы программа читала, скажем, 5000 записей за раз, и вставляла их в Table B. Поскольку Table B не имеет индексов, будьте осторожны, чтобы не использовать многопроцессорность; если многопроцессорность, убедитесь, что нет дублирующихся данных при вставке в B; если это 10 миллионов записей, 5000 за раз, предполагая, что эта операция занимает 500ms, то 2000*200ms = 16 минут. Это всего лишь оценка, конкретные ситуации зависят от состояния сервера в то время, трудно детализировать. Кроме того, нам нужно записать момент времени, когда начинается эта миграция, обозначенный как t1;
  6. Постройте индексы для B, подождите, пока все индексы будут готовы, затем продолжите с 6
  7. Итак, в этот момент, все ли данные Table A вошли в Table B? Следует сказать, что большая часть вошла, но, как упоминалось в 5, это занимает около 16 минут. За такое долгое время могли войти новые данные, или существующие данные могли быть обновлены. Поэтому нам нужно найти данные в Table A, которые изменились после t1, а затем обновить их в Table B. Наш подход:
    1
    2
    3
    4
    5
    
     Запишите момент времени, соответствующий этой операции t2
     BEGIN;
     DELETE FROM B WHERE updated_time > t1;
     INSERT INTO B(field1, field2) SELECT field1, field2 FROM A WHERE updated_time >t1;
     COMMIT;
    
  8. Теперь A и B должны быть почти синхронизированы, верно? Почти, но после выполнения 6, A всё ещё пишет, потомки бесконечны… Но в этот момент разница между A и B очень, очень мала. Итак, на следующем шаге мы выполняем следующие операции в транзакции:
    1
    2
    3
    4
    5
    6
    7
    
     BEGIN;
     DELETE FROM B WHERE updated_time > t2;
     INSERT INTO B(field1, field2) SELECT field1, field2 FROM A WHERE updated_time >t2;
    
     ALTER TABLE A RENAME TO C;
     ALTER TABLE B RENAME TO A;
     COMMIT;
    

MySQL Workbench

Разрешить обновление без where

1
SET SQL_SAFE_UPDATES = 0;

Советы клиента

1
2
3
4
Error Code: 2013. Lost connection to MySQL server during query
Error Code: 2006. MySQL server has gone away

Перейдите в Edit -> Preferences -> SQL Editor и установите более высокое значение для этого параметра: DBMS connection read time out (в секундах). Например: 86400.

Изменить на F5 Выполнить текущий выбранный оператор

Метод: Измените содержимое в C:\Program Files\MySQL\MySQL Workbench 6.3 CE\data\main_menu.xml

1
2
3
4
5
6
7
8
9
10
        <value type="object" struct-name="app.MenuItem" id="com.mysql.wb.menu.query.execute_current_statementwin"> 
          <link type="object" key="owner" struct-name="app.MenuItem">com.mysql.wb.menu.query</link> 
          <value type="string" key="caption">Execute Current Statement</value> 
          <value type="string" key="name">query.execute_current_statement</value> 
          <value type="string" key="command">builtin:query.execute_current_statement</value> 
          <value type="string" key="itemType">action</value> 
          <value type="string" key="shortcut">F5</value>
          <value type="string" key="platform">windows</value>
        </value> 

Устранение неполадок

Забыли пароль

  • mysql 5.7 Ubuntu 64
1
2
3
4
5
sudo service mysql status
sudo service mysql stop
mkdir -p /var/run/mysqld
chown mysql:mysql /var/run/mysqld
sudo mysqld_safe --skip-grant-tables --skip-networking &  
1
mysql -u root --socket=/tmp/mysql.sock
1
2
3
use mysql; 
update user set authentication_string=PASSWORD("aaaaaaaaaaa") where User='root';
flush privileges;
1
sudo service mysql restart

Диск заполнен

RDS Alibaba Cloud, когда диск заполнен, будет показывать статус --rds-read-drop-only. В это время вы можете только читать данные или удалить базу данных (в конце концов, обновление диска требует перезапуска).

Самое быстрое решение в это время — удалить базу данных.

Второй вариант — перенести базу данных, затем удалить её.

Или оптимизировать структуру таблицы данных в периоды низкой нагрузки бизнеса

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT 
    ROW_FORMAT,
    TABLE_ROWS,
    DATA_LENGTH,
    INDEX_LENGTH,
    MAX_DATA_LENGTH,
    DATA_FREE,
    TABLE_SCHEMA,
    TABLE_NAME,
    ENGINE
FROM
    information_schema.TABLES
    order by data_free desc, TABLE_NAME

OPTIMIZE TABLE  db.tables

Освободите эти недействительные пространства

Ссылки

  1. Table Locking Issues
  2. privileges-provided
  3. RDS MySQL Генерация и обработка Metadata Lock на таблицах
  4. Причины и решения MySQL Waiting for table metadata lock
  5. How to Allow Remote MySQL Database Connection
  6. Метод решения ошибки Lost connection to MySQL server during query
  7. Большое использование команды mysql show processlist
  8. Privileges Provided by MySQL
  9. Помните, никогда не используйте “utf8” в MySQL
  10. Принципы индексов MySQL и оптимизация медленных запросов
  11. Как изменить большие таблицы данных в Mysql
  12. Двоичный журнал MySQL (Binary Log)
  13. how-to-get-size-of-mysql-database
  14. How to detect rows with chinese characters in MySQL?
  15. Облачная база данных RDS > Технические проблемы эксплуатации > Использование MYSQL
  16. mysql: подробное объяснение show processlist
  17. MySQL SHOW PROCESSLIST Помогает в устранении неполадок
  18. Решение mysqld_safe Directory ‘/var/run/mysqld’ for UNIX socket file don’t exists
  19. MySQL5.7 Ошибка 1054 (42S22): Unknown column ‘password’ in ‘field list’ при изменении пароля
  20. create-user
  21. GRANT
  22. privileges-provided
  23. Управление пользователями MySQL: Добавление пользователей, Предоставление прав, Удаление пользователей
  24. Подробное объяснение медленных запросов
  25. Оптимизация базы данных MySQL, этой статьи достаточно

Alibaba Cloud

  1. Предложения по настройке параметров
  2. 10 минут для создания решения анализа и визуализации MySQL Binlog
  3. Как устранить неполадки причин автоматической блокировки после заполнения пространства экземпляра MySQL