percona-toolkit大表操作DDL使用
1. 系统与安装数据库
[root@zhang ~]# cat /etc/redhat-release # 也可以使用其他版本
CentOS Linux release 7.4. (Core)
[root@zhang ~]# yum install -y mariadb mariadb-server # CentOS7的mysql数据库为mariadb
………………
[root@zhang ~]# systemctl enable mariadb.service # 开机自启动mariadb
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.
[root@zhang ~]# systemctl start mariadb.service # 启动mariadb
[root@zhang ~]# systemctl status mariadb.service # 查看mariadb服务状态
● mariadb.service - MariaDB database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
Active: active (running) since Wed -- :: CST; 6s ago
Process: ExecStartPost=/usr/libexec/mariadb-wait-ready $MAINPID (code=exited, status=/SUCCESS)
Process: ExecStartPre=/usr/libexec/mariadb-prepare-db-dir %n (code=exited, status=/SUCCESS)
………………
2. 数据库准备工作
2.1. 数据库字符集修改
2.1.1. 数据库版本信息
MariaDB [(none)]> select version();
+----------------+
| version() |
+----------------+
| 5.5.-MariaDB |
+----------------+
row in set (0.00 sec)
2.1.2. 支持哪些字符集
MariaDB [(none)]> show CHARACTER SET;
## 字符集 描述 默认校对规则 最大长度
+----------+-----------------------------+---------------------+--------+
| Charset | Description | Default collation | Maxlen |
+----------+-----------------------------+---------------------+--------+
| big5 | Big5 Traditional Chinese | big5_chinese_ci | |
| dec8 | DEC West European | dec8_swedish_ci | |
| cp850 | DOS West European | cp850_general_ci | |
| hp8 | HP West European | hp8_english_ci | |
| koi8r | KOI8-R Relcom Russian | koi8r_general_ci | |
| latin1 | cp1252 West European | latin1_swedish_ci | |
| latin2 | ISO - Central European | latin2_general_ci | |
| swe7 | 7bit Swedish | swe7_swedish_ci | |
| ascii | US ASCII | ascii_general_ci | |
| ujis | EUC-JP Japanese | ujis_japanese_ci | |
| sjis | Shift-JIS Japanese | sjis_japanese_ci | |
| hebrew | ISO - Hebrew | hebrew_general_ci | |
| tis620 | TIS620 Thai | tis620_thai_ci | |
| euckr | EUC-KR Korean | euckr_korean_ci | |
| koi8u | KOI8-U Ukrainian | koi8u_general_ci | |
| gb2312 | GB2312 Simplified Chinese | gb2312_chinese_ci | |
| greek | ISO - Greek | greek_general_ci | |
| cp1250 | Windows Central European | cp1250_general_ci | |
| gbk | GBK Simplified Chinese | gbk_chinese_ci | |
| latin5 | ISO - Turkish | latin5_turkish_ci | |
| armscii8 | ARMSCII- Armenian | armscii8_general_ci | |
| utf8 | UTF- Unicode | utf8_general_ci | |
| ucs2 | UCS- Unicode | ucs2_general_ci | |
| cp866 | DOS Russian | cp866_general_ci | |
| keybcs2 | DOS Kamenicky Czech-Slovak | keybcs2_general_ci | |
| macce | Mac Central European | macce_general_ci | |
| macroman | Mac West European | macroman_general_ci | |
| cp852 | DOS Central European | cp852_general_ci | |
| latin7 | ISO - Baltic | latin7_general_ci | |
| utf8mb4 | UTF- Unicode | utf8mb4_general_ci | |
| cp1251 | Windows Cyrillic | cp1251_general_ci | |
| utf16 | UTF- Unicode | utf16_general_ci | |
| cp1256 | Windows Arabic | cp1256_general_ci | |
| cp1257 | Windows Baltic | cp1257_general_ci | |
| utf32 | UTF- Unicode | utf32_general_ci | |
| binary | Binary pseudo charset | binary | |
| geostd8 | GEOSTD8 Georgian | geostd8_general_ci | |
| cp932 | SJIS for Windows Japanese | cp932_japanese_ci | |
| eucjpms | UJIS for Windows Japanese | eucjpms_japanese_ci | |
+----------+-----------------------------+---------------------+--------+
rows in set (0.00 sec)
2.1.3. 当前数据库默认字符集
MariaDB [(none)]> show variables like '%character_set%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 | ## 客户端来源数据使用的字符集
| character_set_connection | utf8 | ## 连接层字符集
| character_set_database | latin1 | ## 当前选中数据库的默认字符集
| character_set_filesystem | binary |
| character_set_results | utf8 | ## 查询结果返回字符集
| character_set_server | latin1 | ## 默认的内部操作字符集【服务端(数据库)字符】
| character_set_system | utf8 | ## 系统元数据(字段名等)字符集【Linux系统字符集】
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
rows in set (0.00 sec)
2.1.4. 修改字符集为utf8
[root@zhang ~]# vim /etc/my.cnf
[client]
default-character-set=utf8 [mysqld]
character-set-server=utf8
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd [mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid #
# include all files from the config directory
#
!includedir /etc/my.cnf.d [root@zhang ~]# systemctl restart mariadb.service # 重启mariadb # 字符集查看
MariaDB [(none)]> show variables like '%character_set%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
rows in set (0.00 sec)
2.2. 数据库建库、授权操作
2.2.1. 创建数据库
MariaDB [(none)]> create database zhangtest01;
Query OK, row affected (0.00 sec) MariaDB [(none)]> show create database zhangtest01;
+-------------+----------------------------------------------------------------------+
| Database | Create Database |
+-------------+----------------------------------------------------------------------+
| zhangtest01 | CREATE DATABASE `zhangtest01` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+-------------+----------------------------------------------------------------------+
row in set (0.00 sec) MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| zhangtest01 |
+--------------------+
rows in set (0.00 sec)
2.2.2. 授权
MariaDB [(none)]> grant all on zhangtest01.* to zhang01@'%' identified by 'zhang01'; # 错误授权【大表操作时会失败】
Query OK, rows affected (0.00 sec) MariaDB [(none)]> grant all on *.* to zhang06@'%' identified by 'zhang06'; # 正确授权
Query OK, rows affected (0.00 sec) MariaDB [(none)]> flush privileges; # 刷新权限
Query OK, rows affected (0.00 sec) MariaDB [(none)]> show grants for zhang01@'%' ;
+--------------------------------------------------------------------------------------------------------+
| Grants for zhang01@% |
+--------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'zhang01'@'%' IDENTIFIED BY PASSWORD '*4D6E977808109CE3DEEDEDA4E3EA17CE0F9CC8C1' |
| GRANT ALL PRIVILEGES ON `zhangtest01`.* TO 'zhang01'@'%' |
+--------------------------------------------------------------------------------------------------------+
rows in set (0.00 sec) MariaDB [(none)]> show grants for zhang06@'%' ;
+-----------------------------------------------------------------------------------------------------------------+
| Grants for zhang06@% |
+-----------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'zhang06'@'%' IDENTIFIED BY PASSWORD '*45D6EF2FFF78EB89123D0056C9AE2FC6BA6DA0E7' |
+-----------------------------------------------------------------------------------------------------------------+
row in set (0.00 sec) mysql> show variables like '%connect%';
+--------------------------+-----------------+
| Variable_name | Value |
+--------------------------+-----------------+
| character_set_connection | utf8 |
| collation_connection | utf8_general_ci |
| connect_timeout | |
| extra_max_connections | |
| init_connect | |
| max_connect_errors | |
| max_connections | |
| max_user_connections | |
+--------------------------+-----------------+
rows in set (0.00 sec) mysql> show status like '%connect%'; # 连接信息
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| Aborted_connects | |
| Connections | |
| Max_used_connections | |
| Ssl_client_connects | |
| Ssl_connect_renegotiates | |
| Ssl_finished_connects | |
| Threads_connected | |
+--------------------------+-------+
rows in set (0.00 sec)
2.3. 数据库建表、插入数据
2.3.1. 建表语句
CREATE TABLE `zhang_test` (
`id` int() NOT NULL,
`name` varchar() NOT NULL,
`address` varchar() DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2.3.2. 插入语句示例
INSERT INTO `zhangtest01`.`zhang_test` (`id`, `name`, `address`) VALUES ('', 'test0', '中国XX省XX市0');
2.3.3. 对应的批量SQL语句脚本
[root@zhang database]# vim batch_insert.sh
#!/bin/sh for i in `echo {..}`;do
echo "INSERT INTO zhangtest01.zhang_test (id, name, address) VALUES ('${i}', 'test${i}', '中国XX省XX市${i}'); " done
执行脚本将插入数据放到一个文本中,之后导入数据库即可
3. percona-toolkit安装【可以在另外一台机器】
# 官网下载
[root@zhang tools]# wget https://www.percona.com/downloads/percona-toolkit/3.0.10/binary/redhat/7/x86_64/percona-toolkit-3.0.10-1.el7.x86_64.rpm
………………
[root@zhang tools]# yum install -y percona-toolkit-3.0.-.el7.x86_64.rpm
………………
[root@docker01 tools]# pt-online-schema-change --help # 帮助文档
………………
4. 大表DDL操作
4.1. 添加表字段【并保存原始表】
[root@docker01 tools]# pt-online-schema-change -h172.16.1. -uzhang06 -pzhang06 --nocheck-replication-filters --nodrop-old-table --charset=UTF8 --max-load="Threads_running=1000" --alter "add uuid varchar(100) NOT NULL DEFAULT '0' COMMENT 'UUID' after id" D=zhangtest01,t=zhang_test --execute # 语句
No slaves found. See --recursion-method if host zhang has slaves.
Not checking slave lag because no slaves were found and --check-slave-lag was not specified.
Operation, tries, wait:
analyze_table, ,
copy_rows, , 0.25
create_triggers, ,
drop_triggers, ,
swap_tables, ,
update_foreign_keys, ,
Altering `zhangtest01`.`zhang_test`...
Creating new table...
Created new table zhangtest01._zhang_test_new OK.
Altering new table...
Altered `zhangtest01`.`_zhang_test_new` OK.
--23T13:: Creating triggers...
--23T13:: Created triggers OK.
--23T13:: Copying approximately rows...
Copying `zhangtest01`.`zhang_test`: % : remain
--23T13:: Copied rows OK.
--23T13:: Swapping tables...
--23T13:: Swapped original and new tables OK.
Not dropping old table because --no-drop-old-table was specified.
--23T13:: Dropping triggers...
--23T13:: Dropped triggers OK.
Successfully altered `zhangtest01`.`zhang_test`.
4.1.1. 修改后的表结构
CREATE TABLE `zhang_test` (
`id` int() NOT NULL,
`uuid` varchar() NOT NULL DEFAULT '' COMMENT 'UUID',
`name` varchar() NOT NULL,
`address` varchar() DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
4.1.2. 命令参数说明
--nocheck-replication-filters
不检查复制过滤器【有主从复制也照样执行】 --[no]drop-old-table
操作完后是否删除原始表【默认TRUE】 --critical-load="Threads_running=1000" # 终止拷贝【不优先使用】
类似于--max-load,不同的是检测到超高负载时会直接中断OSC进程而不是暂停
--max-load="Threads_running=1000" # 暂停拷贝【优先使用】
默认如果检测到服务器负载过重会暂停操作
检查每个块后显示全局状态,如果负载太高暂停(默认Threads_running=) D=zhangtest01
操作的哪个数据库 t=zhang_test
操作哪张表 --execute
执行操作
4.2. 修改表字段
[root@docker01 ~]# pt-online-schema-change -h172.16.1. -uzhang06 -pzhang06 --nocheck-replication-filters --charset=UTF8 --max-load="Threads_running=1000" --alter "MODIFY uuid varchar(80)" D=zhangtest01,t=zhang_test --execute
[root@docker01 ~]# pt-online-schema-change -h172.16.1. -uzhang06 -pzhang06 --nocheck-replication-filters --charset=UTF8 --max-load="Threads_running=1000" --alter "MODIFY uuid int(11)" D=zhangtest01,t=zhang_test --execute
No slaves found. See --recursion-method if host zhang has slaves.
Not checking slave lag because no slaves were found and --check-slave-lag was not specified.
Operation, tries, wait:
analyze_table, ,
copy_rows, , 0.25
create_triggers, ,
drop_triggers, ,
swap_tables, ,
update_foreign_keys, ,
Altering `zhangtest01`.`zhang_test`...
Creating new table...
Created new table zhangtest01._zhang_test_new OK.
Altering new table...
Altered `zhangtest01`.`_zhang_test_new` OK.
--23T22:: Creating triggers...
--23T22:: Created triggers OK.
--23T22:: Copying approximately rows...
--23T22:: Copied rows OK.
--23T22:: Swapping tables...
--23T22:: Swapped original and new tables OK.
--23T22:: Dropping old table...
--23T22:: Dropped old table `zhangtest01`.`__zhang_test_old` OK.
--23T22:: Dropping triggers...
--23T22:: Dropped triggers OK.
Successfully altered `zhangtest01`.`zhang_test`.
4.3. 删除表字段
[root@docker01 ~]# pt-online-schema-change -h172.16.1. -uzhang06 -pzhang06 --nocheck-replication-filters --charset=UTF8 --max-load="Threads_running=1000" --alter "DROP uuid" D=zhangtest01,t=zhang_test --execute
No slaves found. See --recursion-method if host zhang has slaves.
Not checking slave lag because no slaves were found and --check-slave-lag was not specified.
Operation, tries, wait:
analyze_table, ,
copy_rows, , 0.25
create_triggers, ,
drop_triggers, ,
swap_tables, ,
update_foreign_keys, ,
Altering `zhangtest01`.`zhang_test`...
Creating new table...
Created new table zhangtest01._zhang_test_new OK.
Altering new table...
Altered `zhangtest01`.`_zhang_test_new` OK.
--23T22:: Creating triggers...
--23T22:: Created triggers OK.
--23T22:: Copying approximately rows...
--23T22:: Copied rows OK.
--23T22:: Swapping tables...
--23T22:: Swapped original and new tables OK.
--23T22:: Dropping old table...
--23T22:: Dropped old table `zhangtest01`.`__zhang_test_old` OK.
--23T22:: Dropping triggers...
--23T22:: Dropped triggers OK.
Successfully altered `zhangtest01`.`zhang_test`.
4.4. 添加表索引
[root@docker01 ~]# pt-online-schema-change -h172.16.1. -uzhang06 -pzhang06 --nocheck-replication-filters --charset=UTF8 --max-load="Threads_running=1000" --alter "ADD INDEX index_name(name)" D=zhangtest01,t=zhang_test --execute # ADD INDEX indexName(columnName)
No slaves found. See --recursion-method if host zhang has slaves.
Not checking slave lag because no slaves were found and --check-slave-lag was not specified.
Operation, tries, wait:
analyze_table, ,
copy_rows, , 0.25
create_triggers, ,
drop_triggers, ,
swap_tables, ,
update_foreign_keys, ,
Altering `zhangtest01`.`zhang_test`...
Creating new table...
Created new table zhangtest01._zhang_test_new OK.
Altering new table...
Altered `zhangtest01`.`_zhang_test_new` OK.
--23T22:: Creating triggers...
--23T22:: Created triggers OK.
--23T22:: Copying approximately rows...
--23T22:: Copied rows OK.
--23T22:: Swapping tables...
--23T22:: Swapped original and new tables OK.
--23T22:: Dropping old table...
--23T22:: Dropped old table `zhangtest01`.`__zhang_test_old` OK.
--23T22:: Dropping triggers...
--23T22:: Dropped triggers OK.
Successfully altered `zhangtest01`.`zhang_test`.
4.4.1. 修改后的表结构
CREATE TABLE `zhang_test` (
`id` int() NOT NULL,
`uuid` int() DEFAULT NULL,
`name` varchar() NOT NULL,
`address` varchar() DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `index_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
4.5. 删除表索引
[root@docker01 ~]# pt-online-schema-change -h172.16.1. -uzhang06 -pzhang06 --nocheck-replication-filters --charset=UTF8 --max-load="Threads_running=1000" --alter "DROP INDEX index_name" D=zhangtest01,t=zhang_test --execute # DROP INDEX indexName
No slaves found. See --recursion-method if host zhang has slaves.
Not checking slave lag because no slaves were found and --check-slave-lag was not specified.
Operation, tries, wait:
analyze_table, ,
copy_rows, , 0.25
create_triggers, ,
drop_triggers, ,
swap_tables, ,
update_foreign_keys, ,
Altering `zhangtest01`.`zhang_test`...
Creating new table...
Created new table zhangtest01._zhang_test_new OK.
Altering new table...
Altered `zhangtest01`.`_zhang_test_new` OK.
--23T22:: Creating triggers...
--23T22:: Created triggers OK.
--23T22:: Copying approximately rows...
--23T22:: Copied rows OK.
--23T22:: Swapping tables...
--23T22:: Swapped original and new tables OK.
--23T22:: Dropping old table...
--23T22:: Dropped old table `zhangtest01`.`__zhang_test_old` OK.
--23T22:: Dropping triggers...
--23T22:: Dropped triggers OK.
Successfully altered `zhangtest01`.`zhang_test`.
4.6. 添加唯一索引
##### 注意:确保字段中数据的唯一性,不然会丢失数据
[root@docker01 ~]# pt-online-schema-change -h172.16.1. -uzhang06 -pzhang06 --nocheck-replication-filters --nocheck-unique-key-change --charset=UTF8 --max-load="Threads_running=1000" --alter "ADD UNIQUE uniq_index_name(name)" D=zhangtest01,t=zhang_test --execute # ADD UNIQUE uniqueName(columnName)
No slaves found. See --recursion-method if host zhang has slaves.
Not checking slave lag because no slaves were found and --check-slave-lag was not specified.
Operation, tries, wait:
analyze_table, ,
copy_rows, , 0.25
create_triggers, ,
drop_triggers, ,
swap_tables, ,
update_foreign_keys, ,
Altering `zhangtest01`.`zhang_test`...
Creating new table...
Created new table zhangtest01._zhang_test_new OK.
Altering new table...
Altered `zhangtest01`.`_zhang_test_new` OK.
--23T22:: Creating triggers...
--23T22:: Created triggers OK.
--23T22:: Copying approximately rows...
Copying `zhangtest01`.`zhang_test`: % : remain
--23T22:: Copied rows OK.
--23T22:: Swapping tables...
--23T22:: Swapped original and new tables OK.
--23T22:: Dropping old table...
--23T22:: Dropped old table `zhangtest01`.`__zhang_test_old` OK.
--23T22:: Dropping triggers...
--23T22:: Dropped triggers OK.
Successfully altered `zhangtest01`.`zhang_test`.
4.6.1. 修改后的表结构
CREATE TABLE `zhang_test` (
`id` int() NOT NULL,
`uuid` int() DEFAULT NULL,
`name` varchar() NOT NULL,
`address` varchar() DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_index_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
4.6.2. 命令参数说明
--nocheck-unique-key-change
添加该参数选项,才可以添加唯一索引
4.7. 删除唯一索引
##### 与删除普通索引一样
[root@docker01 ~]# pt-online-schema-change -h172.16.1. -uzhang06 -pzhang06 --nocheck-replication-filters --charset=UTF8 --max-load="Threads_running=1000" --alter "DROP INDEX uniq_index_name" D=zhangtest01,t=zhang_test --execute # DROP UNIQUE uniqueName
No slaves found. See --recursion-method if host zhang has slaves.
Not checking slave lag because no slaves were found and --check-slave-lag was not specified.
Operation, tries, wait:
analyze_table, ,
copy_rows, , 0.25
create_triggers, ,
drop_triggers, ,
swap_tables, ,
update_foreign_keys, ,
Altering `zhangtest01`.`zhang_test`...
Creating new table...
Created new table zhangtest01._zhang_test_new OK.
Altering new table...
Altered `zhangtest01`.`_zhang_test_new` OK.
--23T22:: Creating triggers...
--23T22:: Created triggers OK.
--23T22:: Copying approximately rows...
--23T22:: Copied rows OK.
--23T22:: Swapping tables...
--23T22:: Swapped original and new tables OK.
--23T22:: Dropping old table...
--23T22:: Dropped old table `zhangtest01`.`__zhang_test_old` OK.
--23T22:: Dropping triggers...
--23T22:: Dropped triggers OK.
Successfully altered `zhangtest01`.`zhang_test`.
4.8. 删除表主键
4.8.1. 重要说明
对主键修改的步骤:
、保证有一个唯一索引【如果没有那么就添加一个唯一索引】
、删除原主键
、添加新主键
、删除之前的唯一索引【可选】
原因如下:
The new table `zhangtest01`.`_zhang_test_new` does not have a PRIMARY KEY or a unique index which is required for the DELETE trigger.
[root@docker01 ~]# pt-online-schema-change -h172.16.1. -uzhang06 -pzhang06 --nocheck-replication-filters --nocheck-alter --charset=UTF8 --max-load="Threads_running=1000" --alter "DROP PRIMARY KEY" D=zhangtest01,t=zhang_test --execute
No slaves found. See --recursion-method if host zhang has slaves.
Not checking slave lag because no slaves were found and --check-slave-lag was not specified.
Operation, tries, wait:
analyze_table, ,
copy_rows, , 0.25
create_triggers, ,
drop_triggers, ,
swap_tables, ,
update_foreign_keys, ,
Altering `zhangtest01`.`zhang_test`...
Creating new table...
Created new table zhangtest01._zhang_test_new OK.
Altering new table...
Altered `zhangtest01`.`_zhang_test_new` OK.
--23T22:: Creating triggers...
--23T22:: Created triggers OK.
--23T22:: Copying approximately rows...
--23T22:: Copied rows OK.
--23T22:: Swapping tables...
--23T22:: Swapped original and new tables OK.
--23T22:: Dropping old table...
--23T22:: Dropped old table `zhangtest01`.`__zhang_test_old` OK.
--23T22:: Dropping triggers...
--23T22:: Dropped triggers OK.
Successfully altered `zhangtest01`.`zhang_test`.
4.8.2. 修改后的表结构【没有主键了,但有唯一索引】
CREATE TABLE `zhang_test` (
`id` int() NOT NULL,
`uuid` int() DEFAULT NULL,
`name` varchar() NOT NULL,
`address` varchar() DEFAULT NULL,
UNIQUE KEY `uniq_index_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
4.8.3. 命令参数说明
--[no]check-alter
解析-ALTER指定并尝试警告可能的意外行为(默认为“是”)
如果没有改选项,修改会失败
4.9. 添加表主键
[root@docker01 ~]# pt-online-schema-change -h172.16.1. -uzhang06 -pzhang06 --nocheck-replication-filters --nocheck-alter --charset=UTF8 --max-load="Threads_running=1000" --alter "ADD PRIMARY KEY (id)" D=zhangtest01,t=zhang_test --execute
No slaves found. See --recursion-method if host zhang has slaves.
Not checking slave lag because no slaves were found and --check-slave-lag was not specified.
Operation, tries, wait:
analyze_table, ,
copy_rows, , 0.25
create_triggers, ,
drop_triggers, ,
swap_tables, ,
update_foreign_keys, ,
Altering `zhangtest01`.`zhang_test`...
Creating new table...
Created new table zhangtest01._zhang_test_new OK.
Altering new table...
Altered `zhangtest01`.`_zhang_test_new` OK.
--23T22:: Creating triggers...
--23T22:: Created triggers OK.
--23T22:: Copying approximately rows...
--23T22:: Copied rows OK.
--23T22:: Swapping tables...
--23T22:: Swapped original and new tables OK.
--23T22:: Dropping old table...
--23T22:: Dropped old table `zhangtest01`.`__zhang_test_old` OK.
--23T22:: Dropping triggers...
--23T22:: Dropped triggers OK.
Successfully altered `zhangtest01`.`zhang_test`.
4.9.1. 修改后的表结构
CREATE TABLE `zhang_test` (
`id` int() NOT NULL,
`uuid` int() DEFAULT NULL,
`name` varchar() NOT NULL,
`address` varchar() DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_index_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
4.10. 多个操作合一
[root@docker01 ~]# pt-online-schema-change -h172.16.1. -uzhang06 -pzhang06 --nocheck-replication-filters --charset=UTF8 --max-load="Threads_running=1000" --alter "add last_name varchar(20) NOT NULL DEFAULT '' COMMENT '姓名' after name, ADD INDEX index_address(address), add birthday date COMMENT '生日'" D=zhangtest01,t=zhang_test --execute
No slaves found. See --recursion-method if host zhang has slaves.
Not checking slave lag because no slaves were found and --check-slave-lag was not specified.
Operation, tries, wait:
analyze_table, ,
copy_rows, , 0.25
create_triggers, ,
drop_triggers, ,
swap_tables, ,
update_foreign_keys, ,
Altering `zhangtest01`.`zhang_test`...
Creating new table...
Created new table zhangtest01._zhang_test_new OK.
Altering new table...
Altered `zhangtest01`.`_zhang_test_new` OK.
--23T22:: Creating triggers...
--23T22:: Created triggers OK.
--23T22:: Copying approximately rows...
--23T22:: Copied rows OK.
--23T22:: Swapping tables...
--23T22:: Swapped original and new tables OK.
--23T22:: Dropping old table...
--23T22:: Dropped old table `zhangtest01`.`__zhang_test_old` OK.
--23T22:: Dropping triggers...
--23T22:: Dropped triggers OK.
Successfully altered `zhangtest01`.`zhang_test`.
4.10.1. 修改前的表结构
CREATE TABLE `zhang_test` (
`id` int() NOT NULL,
`uuid` int() DEFAULT NULL,
`name` varchar() NOT NULL,
`address` varchar() DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_index_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
4.10.2. 修改后的表结构
CREATE TABLE `zhang_test` (
`id` int() NOT NULL,
`uuid` int() DEFAULT NULL,
`name` varchar() NOT NULL,
`last_name` varchar() NOT NULL DEFAULT '' COMMENT '姓名',
`address` varchar() DEFAULT NULL,
`birthday` date DEFAULT NULL COMMENT '生日',
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_index_name` (`name`),
KEY `index_address` (`address`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
5. 附录:
5.1. 参考文章
1、linux下percona-toolkit工具包的安装和使用(超详细版)
percona-toolkit大表操作DDL使用的更多相关文章
- MySQL数据表操作(DDL)
一.创建数据表 语法:create table 表名称(字段 字段类型 [字段属性],字段 字段类型 [字段属性],...) [表选项]; 表选项:数据表的属性,一般包括engine.charset. ...
- SqlServer新建表操作DDL
创建新表:1,五要素 2,not null 3,默认值 4,字段注释,表名称 5,索引 6,指定约束名称 -- ------------------------------ Table structu ...
- MySQL在线大表DDL操作
在线大表DDL操作的方法: 1.主从架构轮询修改 需要注意: a.主库会话级别的记录binglog的参数关闭 b.500\502错误异常捕捉 c.检查备库的second behind master是否 ...
- MySQL在线大表DDL操作 (转)
http://www.cnblogs.com/janehoo/p/5382474.html 线大表DDL操作的方法: 1.主从架构轮询修改 需要注意: a.主库会话级别的记录binglog的参数关闭 ...
- mysql大表在不停机的情况下增加字段该怎么处理
MySQL中给一张千万甚至更大量级的表添加字段一直是比较头疼的问题,遇到此情况通常该如果处理?本文通过常见的三种场景进行案例说明. 1. 环境准备 数据库版本: 5.7.25-28(Percona 分 ...
- MySQL 大表在线DML神器--pt-online-schema-change
一个朋友问我在线对大表进行ddl操作,如何做能尽量避免主从延迟以及不影响在线dml操作呢?我想到一个开源的pt-online-schema-change工具,测试了吧,效果还可以. pt-online ...
- 如何drop大表的中不用的字段 set unused column
转自 http://foxmile.blog.163.com/blog/static/81169805201143191957184/ 我 们要删除表中不用的字段,如果直接drop column,对于 ...
- MySQL 上亿大表优化实践
目录 背景 分析 select xxx_record语句 delete xxx_record语句 测试 实施 索引优化后 delete大表优化为小批量删除 总结 背景 XX实例(一主一从)xxx告警中 ...
- MySQL8.0大表秒加字段,是真的吗?
前言: 很早就听说 MySQL8.0 支持快速加列,可以实现大表秒级加字段.笔者自己本地也有8.0环境,但一直未进行测试.本篇文章我们就一起来看下 MySQL8.0 快速加列到底要如何操作. 1.了解 ...
随机推荐
- Linux_CentOS-服务器搭建 <二>
Tomat安装: 说明: 源码安装,下载地址:http://tomcat.apache.org/.我下了个apache-tomcat-7.0.42.tar.gz 安装开始: 配置环境. JDK: vi ...
- 第一篇:SpringBoot2.0简单介绍
距离Spring Boot1.0发布已经4年了,今年3月份SpringBoot2.0正式发布.让我们一起来了解一下它. Spring Boot主要依赖于Spring,整合了很多框架的使用方式,帮助开发 ...
- quartz执行两遍问题
转:http://blog.csdn.net/hejinwei_1987/article/details/49100975 在现在的项目中发现Quartz执行了两次,在网上找到下列解决方案,我是用的第 ...
- Java并发编程笔记之LinkedBlockingQueue源码探究
JDK 中基于链表的阻塞队列 LinkedBlockingQueue 原理剖析,LinkedBlockingQueue 内部是如何使用两个独占锁 ReentrantLock 以及对应的条件变量保证多线 ...
- thinkphp如何利用反射实现钩子方法
ThinkPHP框架的控制器模块是如何实现 前控制器.后控制器,及如何执行带参数的方法? PHP系统自带的 ReflectionClass.ReflectionMethod 类,可以反射用户自定义类的 ...
- 实现一个简单的vue-router
所有项目的源代码都放在我的github上,欢迎大家start: https://github.com/Jasonwang911/my-vue-router 首先来看下vue-router的使用: im ...
- [LeetCode解题报告] 502. IPO
题目描述 假设 LeetCode 即将开始其 IPO.为了以更高的价格将股票卖给风险投资公司,LeetCode希望在 IPO 之前开展一些项目以增加其资本. 由于资源有限,它只能在 IPO 之前完成最 ...
- python集合操作和内置方法
一 集合基本介绍 集合:在{}内用逗号隔开每个值,集合的特点: 每个值必须是不可变类型 集合是无序的 集合的值不能重复 集合的应用场景较少,最重要的应用场景为进行关系运算以及去重. 二 集合的操作 1 ...
- 《深入理解Java虚拟机》(五)JVM调优 - 工具
JVM调优 - 工具 JConsole:Java监视与管理控制台 JConsole是一个机遇JMX(Java Management Extensions,即Java管理扩展)的JVM监控与管理工具,监 ...
- JAVAEmail工具错误java.lang.ClassNotFoundException: javax.activation.DataSource
JDK9以上或JDK6以下使用mail.jar包不加JAF的activation.jar包会抛出该错误!JDK6以上不需要加该jar包: 参考原文 https://stackoverflow.com/ ...