Percona-Tookit工具包之pt-online-schema-change
###Commonly used parameter introduce.###
connect parameter:
-h hostname -P port -u username -p password -S socket output parameter:
--print -- Show whole procedure of ddl operation on the screen. main parameter:
--alter -- Specify the ddl statement using quotation mark behind. alternative parameter:
--dry-run -- Only operate the new table instead of original one.
--execute -- Directly do all opertion both new and original table. other parameter:
--no-check-alter -- Don't parse your ddl statment which follows behind.
--ask-pass -- You cannot use -p without a string to input password,so you need this parameter. ###Create test table.###
(root@localhost mysql3306.sock)[zlm]::>create table test_ddl(
-> id int unsigned auto_increment,
-> name varchar() not null default '',
-> tel tinyint unsigned not null default ,
-> primary key(id)
-> ) engine=innodb charset=utf8mb4;
Query OK, rows affected (0.01 sec) ###Insert records into table.###
(root@localhost mysql3306.sock)[zlm]::>insert into test_ddl(name,tel) values('zlm',);
ERROR (): Out of range value for column 'tel' at row
(root@localhost mysql3306.sock)[zlm]::>insert into test_ddl(name,tel) values('zlm',);
ERROR (): Out of range value for column 'tel' at row
(root@localhost mysql3306.sock)[zlm]::>insert into test_ddl(name,tel) values('zlm',); -- Scope of unsigned tinyint is ~.
Query OK, row affected (0.00 sec) (root@localhost mysql3306.sock)[zlm]::>select * from test_ddl;
+----+------+-----+
| id | name | tel |
+----+------+-----+
| | zlm | |
+----+------+-----+
row in set (0.00 sec) ###Change column "tel" from tinyint to bigint.###
[root@zlm2 :: ~]
#pt-online-schema-change -hzlm2 -P3306 -uroot --ask-pass --alter "modify tel bigint default 0" --print --execute --no-check-alter D=zlm,t=test_ddl
Enter MySQL password: ###Check slave information.###
No slaves found. See --recursion-method if host zlm2 has slaves.
Not checking slave lag because no slaves were found and --check-slave-lag was not specified. ###Summary of operations.###
Operation, tries, wait:
analyze_table, ,
copy_rows, , 0.25
create_triggers, ,
drop_triggers, ,
swap_tables, ,
update_foreign_keys, ,
Altering `zlm`.`test_ddl`... ###Create new table.###
Creating new table...
CREATE TABLE `zlm`.`_test_ddl_new` (
`id` int() unsigned NOT NULL AUTO_INCREMENT,
`name` varchar() NOT NULL DEFAULT '',
`tel` tinyint() unsigned NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT= DEFAULT CHARSET=utf8mb4
Created new table zlm._test_ddl_new OK. ###Alter column in new table.###
Altering new table...
ALTER TABLE `zlm`.`_test_ddl_new` modify tel bigint default
Altered `zlm`.`_test_ddl_new` OK. -- If you specify "dry-run",it will end here. ###Create Triggers.###
--20T10:: Creating triggers...
--20T10:: Created triggers OK. ###Copy rows into new table.###
--20T10:: Copying approximately rows...
INSERT LOW_PRIORITY IGNORE INTO `zlm`.`_test_ddl_new` (`id`, `name`, `tel`) SELECT `id`, `name`, `tel` FROM `zlm`.`test_ddl` LOCK IN SHARE MODE /*pt-online-schema-change 4190 copy table*/
--20T10:: Copied rows OK. ###Swap oraiginal table with new table.###
--20T10:: Analyzing new table...
--20T10:: Swapping tables...
RENAME TABLE `zlm`.`test_ddl` TO `zlm`.`_test_ddl_old`, `zlm`.`_test_ddl_new` TO `zlm`.`test_ddl`
--20T10:: Swapped original and new tables OK. ###Drop original table.###
--20T10:: Dropping old table...
DROP TABLE IF EXISTS `zlm`.`_test_ddl_old`
--20T10:: Dropped old table `zlm`.`_test_ddl_old` OK. ###Drop triggers.###
--20T10:: Dropping triggers...
DROP TRIGGER IF EXISTS `zlm`.`pt_osc_zlm_test_ddl_del`
DROP TRIGGER IF EXISTS `zlm`.`pt_osc_zlm_test_ddl_upd`
DROP TRIGGER IF EXISTS `zlm`.`pt_osc_zlm_test_ddl_ins`
--20T10:: Dropped triggers OK.
Successfully altered `zlm`.`test_ddl`. ###Check table ddl.###
(root@localhost mysql3306.sock)[zlm]::>show create table test_ddl;
+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test_ddl | CREATE TABLE `test_ddl` (
`id` int() unsigned NOT NULL AUTO_INCREMENT,
`name` varchar() NOT NULL DEFAULT '',
`tel` bigint() DEFAULT '', -- The column "tel" has be changed into bigint type now.
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT= DEFAULT CHARSET=utf8mb4 |
+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
row in set (0.01 sec) ###Check general log file for detail.###
[root@zlm2 :: /data/mysql/mysql3306/data]
#cat zlm2.log mysqld, Version: 5.7.-log (MySQL Community Server (GPL)). started with:
Tcp port: Unix socket: /tmp/mysql3306.sock
Time Id Command Argument
--20T08::.476403Z Query show global variables like '%general_log%'
--20T08::.828985Z Connect root@localhost on zlm using TCP/IP
--20T08::.829297Z Query SHOW VARIABLES LIKE 'innodb\_lock_wait_timeout'
--20T08::.832850Z Query SET SESSION innodb_lock_wait_timeout=
--20T08::.833041Z Query SHOW VARIABLES LIKE 'lock\_wait_timeout'
--20T08::.836907Z Query SET SESSION lock_wait_timeout=
--20T08::.837752Z Query SHOW VARIABLES LIKE 'wait\_timeout'
--20T08::.842090Z Query SET SESSION wait_timeout=
--20T08::.842222Z Query SELECT @@SQL_MODE
--20T08::.842350Z Query SET @@SQL_QUOTE_SHOW_CREATE = /*!40101, @@SQL_MODE='NO_AUTO_VALUE_ON_ZERO,ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'*/
--20T08::.842453Z Query SELECT @@server_id /*!50038 , @@hostname*/
--20T08::.843311Z Connect root@localhost on zlm using TCP/IP
--20T08::.843620Z Query SHOW VARIABLES LIKE 'innodb\_lock_wait_timeout'
--20T08::.847069Z Query SET SESSION innodb_lock_wait_timeout=
--20T08::.847442Z Query SHOW VARIABLES LIKE 'lock\_wait_timeout'
--20T08::.851645Z Query SET SESSION lock_wait_timeout=
--20T08::.851904Z Query SHOW VARIABLES LIKE 'wait\_timeout'
--20T08::.853942Z Query SET SESSION wait_timeout=
--20T08::.854029Z Query SELECT @@SQL_MODE
--20T08::.854055Z Query SET @@SQL_QUOTE_SHOW_CREATE = /*!40101, @@SQL_MODE='NO_AUTO_VALUE_ON_ZERO,ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'*/
--20T08::.854152Z Query SELECT @@server_id /*!50038 , @@hostname*/
--20T08::.854356Z Query SHOW VARIABLES LIKE 'wsrep_on'
--20T08::.857148Z Query SHOW VARIABLES LIKE 'version%'
--20T08::.860325Z Query SHOW ENGINES
--20T08::.861002Z Query SHOW VARIABLES LIKE 'innodb_version'
--20T08::.864957Z Query SHOW VARIABLES LIKE 'innodb_stats_persistent'
--20T08::.867873Z Query SELECT @@SERVER_ID
--20T08::.868114Z Query SHOW GRANTS FOR CURRENT_USER()
--20T08::.868774Z Query SHOW FULL PROCESSLIST
--20T08::.869245Z Query SHOW SLAVE HOSTS
--20T08::.869849Z Query SHOW GLOBAL STATUS LIKE 'Threads_running'
--20T08::.874152Z Query SHOW GLOBAL STATUS LIKE 'Threads_running'
--20T08::.877509Z Query SELECT CONCAT(@@hostname, @@port)
--20T08::.877973Z Query SHOW TABLES FROM `zlm` LIKE 'test\_ddl'
--20T08::.878229Z Query SELECT VERSION()
--20T08::.879011Z Query SHOW TRIGGERS FROM `zlm` LIKE 'test\_ddl'
--20T08::.879506Z Query /*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, @@SQL_MODE := '', @OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, @@SQL_QUOTE_SHOW_CREATE := 1 */
--20T08::.879602Z Query USE `zlm`
--20T08::.879706Z Query SHOW CREATE TABLE `zlm`.`test_ddl`
--20T08::.880123Z Query /*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, @@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */
--20T08::.880979Z Query EXPLAIN SELECT * FROM `zlm`.`test_ddl` WHERE =
--20T08::.881846Z Query SELECT table_schema, table_name FROM information_schema.key_column_usage WHERE referenced_table_schema='zlm' AND referenced_table_name='test_ddl'
--20T08::.893011Z Query /*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, @@SQL_MODE := '', @OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, @@SQL_QUOTE_SHOW_CREATE := 1 */
--20T08::.893622Z Query USE `zlm`
--20T08::.893798Z Query SHOW CREATE TABLE `zlm`.`test_ddl`
--20T08::.893954Z Query /*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, @@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */
--20T08::.894730Z Query CREATE TABLE `zlm`.`_test_ddl_new` (
`id` int() unsigned NOT NULL AUTO_INCREMENT,
`name` varchar() NOT NULL DEFAULT '',
`tel` int() DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT= DEFAULT CHARSET=utf8mb4
--20T08::.914358Z Query ALTER TABLE `zlm`.`_test_ddl_new` modify tel bigint default
--20T08::.934771Z Query /*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, @@SQL_MODE := '', @OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, @@SQL_QUOTE_SHOW_CREATE := 1 */
--20T08::.934930Z Query USE `zlm`
--20T08::.935044Z Query SHOW CREATE TABLE `zlm`.`_test_ddl_new`
--20T08::.936057Z Query /*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, @@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */
--20T08::.936926Z Query SELECT TRIGGER_SCHEMA, TRIGGER_NAME, DEFINER, ACTION_STATEMENT, SQL_MODE, CHARACTER_SET_CLIENT, COLLATION_CONNECTION, EVENT_MANIPULATION, ACTION_TIMING FROM INFORMATION_SCHEMA.TRIGGERS WHERE EVENT_MANIPULATION = 'DELETE' AND ACTION_TIMING = 'AFTER' AND TRIGGER_SCHEMA = 'zlm' AND EVENT_OBJECT_TABLE = 'test_ddl'
--20T08::.937687Z Query SELECT TRIGGER_SCHEMA, TRIGGER_NAME, DEFINER, ACTION_STATEMENT, SQL_MODE, CHARACTER_SET_CLIENT, COLLATION_CONNECTION, EVENT_MANIPULATION, ACTION_TIMING FROM INFORMATION_SCHEMA.TRIGGERS WHERE EVENT_MANIPULATION = 'UPDATE' AND ACTION_TIMING = 'AFTER' AND TRIGGER_SCHEMA = 'zlm' AND EVENT_OBJECT_TABLE = 'test_ddl'
--20T08::.939328Z Query SELECT TRIGGER_SCHEMA, TRIGGER_NAME, DEFINER, ACTION_STATEMENT, SQL_MODE, CHARACTER_SET_CLIENT, COLLATION_CONNECTION, EVENT_MANIPULATION, ACTION_TIMING FROM INFORMATION_SCHEMA.TRIGGERS WHERE EVENT_MANIPULATION = 'INSERT' AND ACTION_TIMING = 'AFTER' AND TRIGGER_SCHEMA = 'zlm' AND EVENT_OBJECT_TABLE = 'test_ddl'
--20T08::.940991Z Query SELECT TRIGGER_SCHEMA, TRIGGER_NAME, DEFINER, ACTION_STATEMENT, SQL_MODE, CHARACTER_SET_CLIENT, COLLATION_CONNECTION, EVENT_MANIPULATION, ACTION_TIMING FROM INFORMATION_SCHEMA.TRIGGERS WHERE EVENT_MANIPULATION = 'DELETE' AND ACTION_TIMING = 'BEFORE' AND TRIGGER_SCHEMA = 'zlm' AND EVENT_OBJECT_TABLE = 'test_ddl'
--20T08::.942390Z Query SELECT TRIGGER_SCHEMA, TRIGGER_NAME, DEFINER, ACTION_STATEMENT, SQL_MODE, CHARACTER_SET_CLIENT, COLLATION_CONNECTION, EVENT_MANIPULATION, ACTION_TIMING FROM INFORMATION_SCHEMA.TRIGGERS WHERE EVENT_MANIPULATION = 'UPDATE' AND ACTION_TIMING = 'BEFORE' AND TRIGGER_SCHEMA = 'zlm' AND EVENT_OBJECT_TABLE = 'test_ddl'
--20T08::.943844Z Query SELECT TRIGGER_SCHEMA, TRIGGER_NAME, DEFINER, ACTION_STATEMENT, SQL_MODE, CHARACTER_SET_CLIENT, COLLATION_CONNECTION, EVENT_MANIPULATION, ACTION_TIMING FROM INFORMATION_SCHEMA.TRIGGERS WHERE EVENT_MANIPULATION = 'INSERT' AND ACTION_TIMING = 'BEFORE' AND TRIGGER_SCHEMA = 'zlm' AND EVENT_OBJECT_TABLE = 'test_ddl'
--20T08::.944624Z Query CREATE TRIGGER `pt_osc_zlm_test_ddl_del` AFTER DELETE ON `zlm`.`test_ddl` FOR EACH ROW DELETE IGNORE FROM `zlm`.`_test_ddl_new` WHERE `zlm`.`_test_ddl_new`.`id` <=> OLD.`id`
--20T08::.949413Z Query CREATE TRIGGER `pt_osc_zlm_test_ddl_upd` AFTER UPDATE ON `zlm`.`test_ddl` FOR EACH ROW BEGIN DELETE IGNORE FROM `zlm`.`_test_ddl_new` WHERE !(OLD.`id` <=> NEW.`id`) AND `zlm`.`_test_ddl_new`.`id` <=> OLD.`id`;REPLACE INTO `zlm`.`_test_ddl_new` (`id`, `name`, `tel`) VALUES (NEW.`id`, NEW.`name`, NEW.`tel`);END
--20T08::.954329Z Query CREATE TRIGGER `pt_osc_zlm_test_ddl_ins` AFTER INSERT ON `zlm`.`test_ddl` FOR EACH ROW REPLACE INTO `zlm`.`_test_ddl_new` (`id`, `name`, `tel`) VALUES (NEW.`id`, NEW.`name`, NEW.`tel`)
--20T08::.959241Z Query EXPLAIN SELECT * FROM `zlm`.`test_ddl` WHERE =
--20T08::.961358Z Query EXPLAIN SELECT `id`, `name`, `tel` FROM `zlm`.`test_ddl` LOCK IN SHARE MODE /*explain pt-online-schema-change 4190 copy table*/
--20T08::.962004Z Query INSERT LOW_PRIORITY IGNORE INTO `zlm`.`_test_ddl_new` (`id`, `name`, `tel`) SELECT `id`, `name`, `tel` FROM `zlm`.`test_ddl` LOCK IN SHARE MODE /*pt-online-schema-change 4190 copy table*/
--20T08::.962769Z Query SHOW WARNINGS
--20T08::.963561Z Query SHOW GLOBAL STATUS LIKE 'Threads_running'
--20T08::.966643Z Query ANALYZE TABLE `zlm`.`_test_ddl_new` /* pt-online-schema-change */
--20T08::.968221Z Query RENAME TABLE `zlm`.`test_ddl` TO `zlm`.`_test_ddl_old`, `zlm`.`_test_ddl_new` TO `zlm`.`test_ddl`
--20T08::.983005Z Query DROP TABLE IF EXISTS `zlm`.`_test_ddl_old`
--20T08::.990393Z Query DROP TRIGGER IF EXISTS `zlm`.`pt_osc_zlm_test_ddl_del`
--20T08::.991005Z Query DROP TRIGGER IF EXISTS `zlm`.`pt_osc_zlm_test_ddl_upd`
--20T08::.991346Z Query DROP TRIGGER IF EXISTS `zlm`.`pt_osc_zlm_test_ddl_ins`
--20T08::.991966Z Query SHOW TABLES FROM `zlm` LIKE '\_test\_ddl\_new'
--20T08::.999016Z Quit
--20T08::.000302Z Quit
Supplement
###Create a test table "test_ddl_no_pk" without primary key.###
(root@localhost mysql3306.sock)[zlm]::>create table test_ddl_no_pk(
-> id int unsigned,
-> name varchar() not null default '',
-> tel tinyint unsigned not null default
-> ) engine=innodb charset=utf8mb4;
Query OK, rows affected (0.12 sec) (root@localhost mysql3306.sock)[zlm]::>insert into test_ddl_no_pk(id,name,tel) values(,'zlm',''),(,'aaron8219','');
Query OK, rows affected (0.00 sec)
Records: Duplicates: Warnings: ###Insert two records into above table.###
(root@localhost mysql3306.sock)[zlm]::>select * from test_ddl_no_pk;
+------+-----------+-----+
| id | name | tel |
+------+-----------+-----+
| | zlm | |
| | aaron8219 | |
+------+-----------+-----+
rows in set (0.00 sec) ###Execute pt-osc again.###
[root@zlm2 :: ~]
#pt-online-schema-change -hzlm2 -P3306 -uroot --ask-pass --alter "modify tel bigint default 0" --print --execute --no-check-alter D=zlm,t=test_ddl_no_pk
Enter MySQL password:
No slaves found. See --recursion-method if host zlm2 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 `zlm`.`test_ddl_no_pk`...
Creating new table...
CREATE TABLE `zlm`.`_test_ddl_no_pk_new` (
`id` int() unsigned DEFAULT NULL,
`name` varchar() NOT NULL DEFAULT '',
`tel` tinyint() unsigned NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
Created new table zlm._test_ddl_no_pk_new OK.
Altering new table...
ALTER TABLE `zlm`.`_test_ddl_no_pk_new` modify tel bigint default
Altered `zlm`.`_test_ddl_no_pk_new` OK.
--21T04:: Dropping new table...
DROP TABLE IF EXISTS `zlm`.`_test_ddl_no_pk_new`; -- There're no create triggers,copy rows and swap table operations any more but directly drop new table operation.
--21T04:: Dropped new table OK.
`zlm`.`test_ddl_no_pk` was not altered.
The new table `zlm`.`_test_ddl_no_pk_new` does not have a PRIMARY KEY or a unique index which is required for the DELETE trigger. -- Indicate the reason why it stop working.
- pt-ocs depends on tirggers,there mustn't be triggers on original table.
- Primary key or unique key is indispensable when use it.Otherwise,it won't work normally.
- Although pt-ocs won't block online transactions but still recommend do online ddl operations in off-peak period.
Percona-Tookit工具包之pt-online-schema-change的更多相关文章
- schema change + ogg 变更手册
Check OGG until no data queuing in replication process:testRO:a)login test5 –l oggmgrb)oggc)#ggsci ...
- Online Schema Change for MySQL
It is great to be able to build small utilities on top of an excellent RDBMS. Thank you MySQL. This ...
- AppBoxFuture(四). 随需而变-Online Schema Change
需求变更是信息化过程中的家常便饭,而在变更过程中如何尽可能小的影响在线业务是比较头疼的事情.举个车联网监控的例子:原终端设备上传车辆的经纬度数据,新的终端设备支持同时上传速度数据,而旧的车辆状态表 ...
- Online, Asynchronous Schema Change in F1
F1: A Distributed SQL Database That Scales http://disksing.com/understanding-f1-schema-change ma ...
- Online Schema Upgrade in MySQL Galera Cluster using TOI Method
http://severalnines.com/blog/online-schema-upgrade-mysql-galera-cluster-using-toi-method As a fo ...
- Schema 与数据类型优化
这是<高性能 MySQL(第三版)>第四章<Schema 与数据类型优化>的读书笔记. 1. 选择优化的数据类型 数据类型的选择原则: 越小越好:选择满足需求的最小类型.注意, ...
- Mysql: pt-table-checksum 和 pt-table-sync 检查主从一致性,实验过程
一.安装 percona 包 1.安装仓库的包 https://www.percona.com/doc/percona-repo-config/yum-repo.html sudo yum insta ...
- mysql大数据表改表结构方案
有一个表有上千W数据, 用什么方法给这个表加一个字段最快?1. alert2. 建一个表和第一个表一样,只是多了要加的字段,然后用多个INSERT INTO SELECT语句limit写入3. 就是导 ...
- 资源list:Github上关于大数据的开源项目、论文等合集
Awesome Big Data A curated list of awesome big data frameworks, resources and other awesomeness. Ins ...
- Servlet3.0学习总结(二)——使用注解标注过滤器(Filter)
Servlet3.0提供@WebFilter注解将一个实现了javax.servlet.Filter接口的类定义为过滤器,这样我们在web应用中使用过滤器时,也不再需要在web.xml文件中配置过滤器 ...
随机推荐
- URL工具类
UrlUtils = { /** * 判断url是否存在(存在跨域问题) * @param {String} url */ isTrueUrl: function(_url) { result = f ...
- 常用css属性记录
CSS常用属性: 字体属性:(font)大小 font-size: x-large;(特大) xx-small;(极小) 一般中文用不到,只要用数值就可以,单位:PX.PD样式 font-style: ...
- XUtils3 的 环境搭建与简单使用
XUtils3 的 环境搭建 环境搭建三部曲 ----------------------- 说明 : author 修雨轩陈 使用andorid Studio 已经创建了一个项目 并且自己需要使用 ...
- QTableview 只显示横向线
#include <QApplication> #include <QTableWidget> #include <QPainter> #include <Q ...
- 保存及读取keras模型参数
转自:http://blog.csdn.net/u010159842/article/details/54407745,感谢分享~ 你可以使用model.save(filepath)将Keras模型和 ...
- java实现12306的45分钟内支付,45分钟后取消订单功能?
java实现12306的45分钟内支付,45分钟后取消订单功能? - 回答作者: 匿名用户 https://zhihu.com/question/27254071/answer/35948645
- spark学习地址
http://blog.sina.com.cn/s/blog_64d9a6ef0101ghvs.html http://blog.sina.com.cn/s/blog_49cd89710102v3b1 ...
- Mantis中的状态
在 Mantis中的 问题状态一共有以下几种 10:new,20:feedback,30:acknowledged,40:confirmed,50:assigned,80:resolved,90:cl ...
- windows下使用VNC进行远程连接
在 windows 电脑上安装 VNC,包含 VNC server 和 VNC viewer,如果仅需要被操控或操控他人,选择型下载安装 VNC server 或 VNC viewer 即可. 在需要 ...
- Hello World, S/4HANA for Customer Management 1.0
SAP CRM的前世今生 在我之前的微信公众号文章 SAP的这三款CRM解决方案,您能区分清楚么我曾经提到过我作为成都SAP研究院CRM产品开发团队的一员工作过一段时间. 我向在SAP德国总部工作的德 ...