华为云用户手册

  • 仅允许特定IP地址远程连接云服务器 场景举例: 为了防止云服务器被网络攻击,用户可以修改远程登录端口号,并设置安全组规则只允许特定的IP地址远程登录到云服务器。 安全组配置方法: 以仅允许特定IP地址(例如,192.168.20.2)通过SSH协议访问Linux操作系统的弹性云服务器的22端口为例,安全组规则如下所示。 方向 协议/应用 端口 源地址 入方向 SSH(22) 22 IPv4 CIDR或者另一个安全组的ID。 例如:192.168.20.2/32
  • 不同安全组内云服务器内网互通 场景举例: 在同一个VPC内,用户需要将某个安全组内一台云服务器上的资源复制到另一个安全组内的云服务器上时,用户可以将两台云服务器设置为内网互通后再复制资源。 安全组配置方法: 同一个VPC内,在同一个安全组内的云服务器默认互通。但是,在不同安全组内的云服务器默认无法通信,此时需要添加安全组规则,使得不同安全组内的云服务器内网互通。 在两台云服务器所在安全组中分别添加一条入方向安全组规则,放通来自另一个安全组内的实例的访问,实现内网互通,安全组规则如下所示。 方向 协议/应用 端口 源地址 入方向 TCP 说明: 此处的协议类型设置内网互通时使用的协议类型。 全部 另一个安全组的ID。 例如:014d7278-XXX-530c95350d43 如果同一个安全组内的云服务器也无法互相通信,请您检查是否已删除对应的规则。 如下所示,以安全组sg-demo为例,“源地址”为sg-demo的规则可以实现同一个安全组内云服务通信。
  • 定时任务 原因及现象 如果实例负载随时间有规律性变化,可能是存在定时任务。 您可以在控制台查看实例的Delete语句执行频率、Insert语句执行频率、Insert_Select语句执行频率、Replace语句执行频率、Replace_Selection语句执行频率、Select语句执行频率、Update语句执行频率等指标,判断是否有规律性变化。具体操作,请参见查看监控指标。 解决方案 调整定时任务的执行时间,建议在业务低峰期执行,并修改可维护时间段为业务低峰期。具体操作,请参见设置可维护时间段。
  • 内存高常见原因 通常InnoDB Buffer Pool的内存占用是最大的,Buffer Pool的内存占用上限受到Buffer Pool配置参数的限制,但是还有很多内存是在请求执行中动态分配和调整的,例如内存临时表消耗的内存、prefetch cache、table cache、哈希索引、行锁对象等,详细的内存占用和相关参数限制,请参见MySQL官方文档。 多语句(multiple statements) MySQL支持将多个SQL语句用英文分号(;)分隔,然后一起发给MySQL,MySQL会逐条处理SQL,但是某些内存需要等到所有的SQL执行结束才释放。 这种multiple statements的发送方式,如果一次性发送的SQL非常多,例如达到数百兆,SQL实际执行过程中各种对象分配累积消耗的内存非常大,很有可能导致MySQL进程内存耗尽。 使用multiple statements发送方式,网络流量会有突增,可以从网络流量监控和SQL洞察,判断是否有这种现象。建议业务实现中尽量避免multiple statements的SQL发送方式。 缓冲池(Buffer Pool)问题 所有表的数据页都存放在缓冲池中,查询执行的时候如果需要的数据页直接命中缓冲池,就不会发生物理I/O,SQL执行的效率较高,缓冲池采用LRU算法管理数据页,所有的脏页放到Flush List链表中。 InnoDB Buffer Pool的内存通常是实例内存中占比最大的。 Buffer Pool相关的常见问题: 数据页预热不足导致查询的延迟较高。通常发生在实例重启、冷数据读取或缓冲池命中率较低的场景,建议升级实例规格或大促前预热数据。 脏页累积太多。当未刷新脏页的最旧LSN和当前LSN的距离超过76%时,会触发用户线程同步刷新脏页,导致实例性能严重下降。优化方式是均衡写入负载、避免写入吞吐过高、调整刷新脏页参数或升级实例规格等。 临时表 内存临时表大小受到参数tmp_table_size和max_heap_table_size限制,超过限制后将转化为磁盘临时表,如果瞬间有大量的连接创建大量的临时表,可能会造成内存突增。MySQL 8.0实现了新的temptable engine,所有线程分配的内存临时表大小之和必须小于参数temptable_max_ram,temptable_max_ram默认为1GB,超出后转换为磁盘临时表。 其他原因 如果实例内表特别多或QPS很高,Table Cache可能也会消耗内存,建议实例避免创建太多表或设置参数table_open_cache过大。 自适应哈希索引占用的内存默认是Bufffer Pool的1/64。如果查询或写入长度非常大的Blob大字段,会对大字段动态分配内存,也会造成内存增加。 如果出现内存使用率异常增加或实例内存耗尽,您可以参考官方文档排查上涨原因。
  • 查看内存使用情况 通过智能DBA助手查看实例的内存使用情况,具体请参见查看性能指标。 您还可以使用performance_schema,设置相关的内存仪表(instrumentation),通过内存占用统计表查看内存占用。更多信息,请参见MySQL官方文档。 MySQL5.6不支持performance_schema内存检测,不能使用performance_schema进行内存检测。 参考修改当前实例参数,设置performance_schema = ON。 重启实例使参数修改生效。 查询sys.memory_global_total视图,查看当前总的内存使用。 select * from sys.memory_global_total; 查询sys.session视图。 查询sys.session视图,current_memory字段记录每个会话的内存使用。 select thd_id,conn_id, current_memory from sys.session; 查看performance_schema下占用内存较高的会话线程内存明细。 select * from memory_summary_by_thread_by_event_name where thread_id= "占用内存较高的线程id" order by CURRENT_NUMBER_OF_BYTES_USED; 查询sys.memory_by_thread_by_current_bytes。 查询sys.memory_by_thread_by_current_bytes,current_allocated字段记录每个后台线程的内存使用。 select thread_id, user, current_allocated from memory_by_thread_by_current_bytes; 查看performance_schema下占用内存较高的后台线程内存明细。 select * from memory_summary_by_thread_by_event_name where thread_id= "占用内存较高的线程id" order by CURRENT_NUMBER_OF_BYTES_USED; 查询memory_global_by_current_bytes视图,按照内存分配类型获取内存使用统计信息。 select event_name,current_alloc from sys.memory_global_by_current_bytes where event_name not like 'memory/performance_schema%' ; 根据查询结果分析内存使用过高原因。
  • 线程池相关操作 查询线程池参数 通过show variables命令查询线程池参数。 show variables like 'threadpool%'; +-----------------------------------+------------+ | Variable_name | Value | +-----------------------------------+------------+ | threadpool_enabled | ON | | threadpool_high_prio_tickets | 4294967295 | | threadpool_idle_timeout | 60 | | threadpool_long_conn_time | 2 | | threadpool_max_threads | 100000 | | threadpool_oversubscribe | 3 | | threadpool_prio_kickup_timer | 1000 | | threadpool_rec_launch_time | ON | | threadpool_size | 128 | | threadpool_slow_conn_log | ON | | threadpool_slow_conn_log_interval | 30 | | threadpool_slow_launch_time | 2 | | threadpool_stall_limit | 500 | +-----------------------------------+------------+ 表1 线程池参数说明 参数名 参数描述 threadpool_enabled 开启或关闭线程池。 threadpool_high_prio_tickets 高优先级线程持有的tickets数量。 threadpool_idle_timeout 线程销毁前等待的空闲时间(单位:秒)。 threadpool_long_conn_time 登录时间超过此值,则在日志中打印此次登录信息。 threadpool_max_threads 线程池共能创建的线程上限。 threadpool_oversubscribe 每个线程组中最多能创建的额外线程数。 threadpool_prio_kickup_timer 低优先级队列中最长停留时间(单位:毫秒)。 threadpool_rec_launch_time 记录线程启动时间。 threadpool_size 线程组数量。 threadpool_slow_conn_log 是否记录慢登录到error log。 threadpool_slow_conn_log_interval 记录频率,记录一次慢登录后,在此时间间隔内不再记录。 threadpool_slow_launch_time 如登录、查询时间大于此值,则status中 threadpool_slow_launch_request增加1。 threadpool_stall_limit 线程组忙碌检查间隔。 表2 线程池可修改参数说明 参数名 是否是动态参数 数据类型 取值范围 说明 threadpool_enabled 是 boolean [ON,OFF] ON:开启线程池。 OFF:关闭线程池。 threadpool_oversubscribe 是 integer [1,50] 每个线程组中最多能创建的额外线程数。 threadpool_size 是 integer [1,512] 线程组数量。 查询线程池状态 通过show status命令查询线程池状态。 show status like 'threadpool%'; +------------------------------------+------------+ | Variable_name | Value | +------------------------------------+------------+ | Threadpool_active_connections | 65 | | Threadpool_active_threads | 5 | | Threadpool_avg_launch_time | 0 | | Threadpool_dump_threads | 0 | | Threadpool_idle_threads | 63 | | Threadpool_running | ON | | Threadpool_slow_launch_request | 0 | | Threadpool_threads | 237 | | Threadpool_threads_high_water_mark | 1075 | | Threadpool_waiting_threads | 57 | | Threadpool_worst_launch_time | 692548 | +------------------------------------+------------+ 表3 线程池状态说明 状态 说明 Threadpool_active_connections 线程池中活跃连接数。 Threadpool_active_threads 线程池中活跃线程数。 Threadpool_avg_launch_time 平均等待时间(单位:毫秒)。 Threadpool_dump_threads dump线程数量。 Threadpool_idle_thread 线程池空闲线程数。 Threadpool_running 线程池是否在运行。 Threadpool_slow_launch_request 超过slow_launch_request的次数。 Threadpool_threads 线程池总连接数。 Threadpool_threads_high_water_mark 历史高位线程数量。 Threadpool_waiting_threads waiting线程池状态。 Threadpool_worst_launch_time 最坏启动时间(单位:毫秒)。
  • 性能测试 表4 不同线程的性能测试 模型 线程 线程池开关是否开启 QPS(每秒查询数) latency(时延,单位是毫秒) oltp_update_non_index 32 是 5932.47 7.84 oltp_update_non_index 64 是 10074.11 9.39 oltp_update_non_index 128 是 18079.61 10.65 oltp_update_non_index 256 是 27439.38 14.46 oltp_update_non_index 512 是 33007.96 28.16 oltp_update_non_index 1024 是 30282.13 51.94 oltp_update_non_index 2048 是 29836.86 95.81
  • 逻辑订阅完整使用示例 发布端创建表 create table tableName(id int primary key, num int); 发布端创建发布 create publication pubName for table tableName; 发布端创建一个Failover Slot(若为PostgreSQL12或13版本,则去掉第四个参数false) SELECT * FROM pg_create_logical_replication_slot('slotname', 'pgoutput', false, false, true); 发布端插入数据 insert into tableName values(1,1); insert into tableName values(2,2); 订阅端创建表 create table tableName (id int primary key, num int); 订阅端创建订阅,指定创建的Failover Slot名称 create subscription subName connection 'host=192.168.0.10 dbname=postgres user=root port=5432 password=xxxxxxx' publication pubName with(copy_data=true,create_slot=false,slot_name= slotname); 订阅端查询数据,验证数据是否订阅到 select * from tableName; 主备切换 发布端继续插入数据,在订阅端查看,逻辑订阅不会断开。
  • 使用方法 在发布端执行如下SQL,创建一个Failover Slot: 表1 命令及参数说明 版本 命令 参数说明 PostgreSQL12和PostgreSQL13版本 SELECT * FROM pg_create_logical_replication_slot('slotname', 'pgoutput', false, true); slotname表示logical slot的名称。 pgoutput表示plugin的名称,也可以更改为其他支持的插件。 第三个参数(例如false),表示该slot是否为临时slot。 第四个参数(例如true),表示该slot是否为Failover Slot。 PostgreSQL14及以上版本 SELECT * FROM pg_create_logical_replication_slot('slotname', 'pgoutput', false, false, true); slotname表示logical slot的名称。 pgoutput表示plugin的名称,也可以更改为其他支持的插件。 第三个参数(例如false),表示该slot是否为临时slot。 第四个参数(例如true),表示是否启动两阶段提交选项。 第五个参数(例如true),表示该复制槽是否为Failover slot。 因此,如果要创建一个Failover Slot,在第三个参数临时slot字段必须为false,最后一个参数必须为true。如果最后一个参数省略不写,则创建的是非Failover Slot。
  • 使用场景 RDS for PostgreSQL的逻辑订阅故障转移(Failover Slot)功能用来将那些指定为failover slot的逻辑复制槽信息从主实例同步到备实例,当主备切换之后逻辑订阅能够继续进行,实现逻辑复制槽的故障转移。 当用户使用逻辑复制时,由于slot信息不会随着主备切换转移到新的主实例上,一旦实例发生主备切换,逻辑订阅就会断开,此时除非手动重新创建slot,否则逻辑订阅无法重新连接。RDS for PostgreSQL的Failover Slot功能可以将所有的logical slot从主实例同步到备实例,避免主备切换后逻辑订阅断开。
  • 应用场景 设置相关参数值如下,分别对下列参数适用的场景进行分析。 show variables like '%idle%'; +-----------------------------------+-------+ | Variable_name | Value | +-----------------------------------+-------+ | idle_readonly_transaction_timeout | 5 | | idle_transaction_timeout | 10 | | idle_write_transaction_timeout | 15 | +-----------------------------------+-------+ 设置idle_readonly_transaction_timeout 设置参数idle_readonly_transaction_timeout=5。 使用begin开启事务,执行查询语句,查询结果如下: begin; Query OK, 0 rows affected (0.00 sec) select * from t1; +-----+-----+-----+-----+ | a | b | c | d | +-----+-----+-----+-----+ | 1 | b | 303 | d | +-----+-----+-----+-----+ 1 row in set (0.00 sec) 在idle_readonly_transaction_timeout设置的5s范围以外执行一次查询操作,结果如下: select * from t1; +-----+-----+-----+-----+ | a | b | c | d | +-----+-----+-----+-----+ | 1 | b | 303 | d | +-----+-----+-----+-----+ 1 row in set (0.00 sec) select * from t1; ERROR 2006(HY000): MySQL server has gone away 设置idle_transaction_timeout,idle_readonly_transaction_timeout,idle_write_transaction_timeout 设置参数idle_transaction_timeout=10,idle_readonly_transaction_timeout=0,idle_write_transaction_timeout=0。 show variables like '%idle%'; +-----------------------------------+-------+ | Variable_name | Value | +-----------------------------------+-------+ | idle_readonly_transaction_timeout | 0 | | idle_transaction_timeout | 10 | | idle_write_transaction_timeout | 0 | +-----------------------------------+-------+ 3 rows in set (0.01 sec) 只读事务 当idle_readonly_transaction_timeout=0时,idle_transaction_timeout参数生效。 使用begin开启事务,查询表数据,结果如下: begin; Query OK, 0 rows affected (0.00 sec) select * from t1; +-----+-----+-----+-----+ | a | b | c | d | +-----+-----+-----+-----+ | 1 | b | 43 | d | +-----+-----+-----+-----+ 1 row in set (0.00 sec) 10s之后重复执行上述查询操作,结果如下: select * from t1; ERROR 2006(HY000): MySQL server has gone away 读写事务 当idle_write_transaction_timeout=0时,,idle_transaction_timeout参数生效。 使用begin开启事务后,插入数据,在10s以内执行一条查询语句,结果如下: begin; Query OK, 0 rows affected (0.00 sec) INSERT INTO t1(a,b,c,d) VALUES (1,'b',FLOOR( 1 + (RAND()*1000)) ,'d'); Query OK, 1 rows affected (0.00 sec) select * from t1; +-----+-----+-----+-----+ | a | b | c | d | +-----+-----+-----+-----+ | 1 | b | 425 | d | +-----+-----+-----+-----+ 1 row in set (0.00 sec) 10s后执行一条查询语句,结果如下: select * from t1; ERROR 2006(HY000): MySQL server has gone away 之后单独执行一条查表语句,结果如下,表示此时事务已经回滚。 select * from t1; Empty set (0.00 sec) 设置idle_write_transaction_timeout 设置参数idle_write_transaction_timeout=15。 首先由begin开启事务并插入一条数据,结果如下: begin; Query OK, 0 rows affected (0.00 sec) INSERT INTO t1(a,b,c,d) VALUES (1,'b',FLOOR( 1 + (RAND()*1000)) ,'d'); Query OK, 1 rows affected (0.00 sec) 在idle_write_transaction_timeout设置的15s范围以内执行一次查询操作,结果如下: select * from t1; +-----+-----+-----+-----+ | a | b | c | d | +-----+-----+-----+-----+ | 1 | b | 987 | d | +-----+-----+-----+-----+ 1 row in set (0.00 sec) 15s后再次执行查询,结果如下: select * from t1; ERROR 2006(HY000): MySQL server has gone away 重新连接数据库,执行一条查询语句,结果如下,表示此时事务已经回滚。 select * from t1; Empty set (0.00 sec)
  • 参数介绍 通过show variables查询相关参数。 show variables like '%idle%'; +------------------------------------+------+ | Variable_name | Value | +-----------------------------------+-------+ | idle_readonly_transaction_timeout | 0 | | idle_transaction_timeout | 0 | | idle_write_transaction_timeout | 0 | +-----------------------------------+-------+ 表1 参数总览 参数名 参数类型 取值范围 是否动态生效 参数描述 idle_readonly_transaction_timeout integer 正整数 是 控制只读事务连接的超时时间(单位:秒),参数设置为0时不生效,即表示只读事务连接的超时时间没有限制。 idle_transaction_timeout integer 正整数 是 控制一般空闲事务连接的超时时间(单位:秒),参数设置为0时不生效,即表示一般空闲事务的连接超时时间没有限制。 说明: “idle_readonly_transaction_timeout”和“idle_write_transaction_timeout”参数的优先级高于“idle_transaction_timeout”参数。 如果设置“idle_readonly_transaction_timeout”或“idle_write_transaction_timeout”参数值并使之生效,那么“idle_transaction_timeout”参数将会失效。 如果仅设置“idle_transaction_timeout”参数值并使之生效,那么在进行事务的读写操作时,超时时间均以“idle_transaction_timeout”设置的参数值为准。 idle_write_transaction_timeout integer 正整数 是 控制读写事务连接的超时时间(单位:秒),参数设置为0时不生效,即表示读写事务连接的超时时间没有限制。
  • MDL锁视图详解 MDL锁视图以系统表的形式呈现,该表位于“information_schema”下,表名称是“metadata_lock_info”。表结构如下所示。 desc information_schema.metadata_lock_info; +---------------+-----------------------+---------+------+----------+--------| | Field | Type | Null |Key |Default | Extra | +---------------+-----------------------+---------+------+----------+--------| | THREAD_ID | bigint(20) unsigned | NO | | 0 | | | LOCK_STATUS | varchar(24) | NO | | | | | LOCK_MODE | varchar(24) | YES | | NULL | | | LOCK_TYPE | varchar(30) | YES | | NULL | | | LOCK_DURATION | varchar(30) | YES | | NULL | | | TABLE_SCHEMA | varchar(64) | YES | | NULL | | | TABLE_NAME | varchar(64) | YES | | NULL | | +---------------+-----------------------+---------+------+----------+--------| 表1 metadata_lock_info字段 序号 字段名 字段定义 字段说明 0 THREAD_ID bigint(20) unsigned 会话ID。 1 LOCK_STATUS varchar(24) MDL锁的两种状态。 PENDING:表示会话正在等待该MDL锁。 GRANTED:表示会话已获得该MDL锁。 2 LOCK_MODE varchar(24) 加锁的模式,如MDL_SHARED 、MDL_EXCLUSIVE 、MDL_SHARED_READ、MDL_SHARED_WRITE等。 3 LOCK_TYPE varchar(30) MDL锁的类型,如Table metadata lock、Schema metadata lock、Global read lock、Tablespace lock等。 4 LOCK_DURATION varchar(30) MDL锁范围,取值如下: MDL_STATEMENT:表示语句级别。 MDL_TRANSACTION:表示事务级别。 MDL_EXPLICIT:表示GLOBAL级别。 5 TABLE_SCHEMA varchar(64) 数据库名,对于部分GLOBAL级别的MDL锁,该值为空。 6 TABLE_NAME varchar(64) 表名,对于部分GLOBAL级别的MDL锁,该值为空。
  • MDL锁视图案例分析 问题描述 用户发现对表t2执行truncate操作一直被阻塞后,业务流程中对表t2执行查询操作也全部被阻塞。 排查分析 无MDL锁视图 当发现DDL语句被阻塞后,执行show processlist查看线程信息,结果如下所示。 show processlist; +------+--------+--------------+--------+-----------+----------+-----------------------------------|-------------------------| | Id | User | Host | db | Command | Time | State |Info | +---------------+-----------------------+-----------+----------+-----------------------------------+-------------------------| | 2 | root | localhost | test | Sleep | 73 | | Null | | 3 | root | localhost | test | Sleep | 63 | | Null | | 4 | root | localhost | Null | Query | 35 | Waiting for table metadata lock | truncate table test.t2 | | 5 | root | localhost | test | Query | 17 | Waiting for table metadata lock | select * from test.t2 | | 6 | root | localhost | test | Query | 0 | starting | show processlist | +------+--------+--------------+--------+-----------+----------+-----------------------------------|-------------------------| 上述线程列表信息显示: ID=4的会话执行truncate操作时被其他会话持有的table metadata lock阻塞。 ID=5的会话执行查询操作时同样被阻塞。 无法确定哪个会话阻塞了ID=4的会话和ID=5的会话。 此时,如果随机KILL其他会话会给线上业务带来很大风险,因此只能等待其他会话释放该MDL锁。 使用MDL锁视图 执行select * from information_schema.metadata_lock_info查看元数据锁信息,结果如下所示。 select * from information_schema.metadata_lock_info; +-------------+-------------+--------------------------+----------------------+-------------------+----------------+----------------+ | THREAD_ID | LOCK_STATUS | LOCK_MODE | LOCK_TYPE | LOCK_DURATION | TABLE_SCHEMA | TABLE_NAME | +-------------+-------------+--------------------------+----------------------+-------------------+----------------+----------------+ | 2 | GRANTED | MDL_SHARED_READ | Table metadata lock | MDL_TRANSACTION | test | t1 | | 3 | GRANTED | MDL_SHARED_READ | Table metadata lock | MDL_TRANSACTION | test | t2 | | 4 | GRANTED | MDL_INTENTION_EXCLUSIVE | Global read lock | MDL_STATEMENT | | | | 4 | GRANTED | MDL_INTENTION_EXCLUSIVE | Schema metadata lock | MDL_TRANSACTION | test | | | 4 | PENDING | MDL_EXCLUSIVE | Table metadata lock | | test | t2 | | 5 | PENDING | MDL_SHARED_READ | Table metadata lock | | test | t2 | +-------------+-------------+--------------------------+----------------------+-------------------+----------------+----------------+ 结合show processlist的结果,从元数据锁视图中可以明显看出: 上述线程信息和元数据锁视图信息显示: THREAD_ID=4的会话正在等待表t2的metadata lock。 THREAD_ID=3的会话持有表t2的metadata lock,该MDL锁为事务级别,因此只要THREAD_ID=3的会话的事务不提交,THREAD_ID=4的会话将会一直阻塞。 因此,用户只需在THREAD_ID=3的会话中执行命令commit或终止THREAD_ID=3的会话,便可以让业务继续运行。
  • MDL锁视图使用示例 使用场景:长时间未提交事务,阻塞DDL,继而阻塞所有同表的操作。 表2 MDL锁视图示例 表名 会话 session2 session3 session4 session5 t1 begin; select * from t1; - - - t2 - begin; select * from t2; - - t3 - - truncate table t2; (blocked) - t4 - - - begin; select * from t2; (blocked)
  • MDL锁视图简介 社区版MySQL如果不打开performance_schema开关,则无法获取表元数据锁(MDL)的详细信息,但通常情况下performance_schema默认关闭,当用户遇到类似“Waiting for metadata lock”的问题而阻塞DML或DDL后,由于无法确定各个会话之间的关联关系,只能重启实例,增加了解决问题的成本,对业务产生了较大影响。 在业务场景较复杂的情况下,一旦涉及对数据库元数据的互斥操作(如DDL、LOCK TABLE等),会频繁发生操作的会话被其他会话阻塞的问题,给用户带来很大的困扰。 针对以上问题,华为云RDS for MySQL推出了MDL锁视图特性,可以查看数据库各会话持有和等待的元数据锁信息,用户可以有效进行系统诊断,优化自身业务,有效降低对业务影响。
  • 功能特点 表1 INNODB_ALTER_TABLE_PROGRESS表字段详解 字段 说明 THREAD_ID 线程ID QUERY ALTER TABLE SQL语句内容 START_TIME DDL开始时间 ELAPSED_TIME 已执行的时间(s) ALTER_TABLE_STAGE 当前执行的内容 STAGE_COMPLETED 已完成的工作单位 STAGE_ESTIMATED 预估的工作单位 一个DDL从开始到结束可能有下面几个阶段(ALTER_TABLE_STAGE字段的值): stage/innodb/alter table (read PK and internal sort):读取主键。 stage/innodb/alter table (merge sort):根据主键排序,这个过程可能较慢,因为会有临时文件生成。 stage/innodb/alter table (insert):将排序后的数据插入表中。 stage/innodb/alter table (log apply index):将DDL过程中客户执行的DML日志应用到本次创建/修改的索引。 stage/innodb/alter table (flush):数据刷盘。 stage/innodb/alter table (log apply table):将DDL过程中客户执行的DML日志应用到本次创建/修改的表。 stage/innodb/alter table (end):结束阶段。
  • 操作步骤 登录 对象存储服务 控制台。 在左侧导航栏中,选择“桶列表”。 在页面右上角,单击“创建桶”。 创建的桶用来存储 媒体处理 服务的媒体文件。 选择桶所属区域,输入桶名称,根据业务需要配置存储类别、桶策略等参数。 单击“立即创建”。 如果输入输出文件存放在同一个桶中,创建一次即可。否则创建两次,分别作为输入、输出桶。 表1 存储类别 存储类别 适用场景 标准存储 适用于有大量热点文件或小文件,且需要频繁访问(平均一个月多次)并快速获取数据的业务场景。 低频访问存储 适用于不频繁访问(平均一年少于12次),但需要快速获取数据的业务场景。 归档存储 适用于很少访问(平均一年一次),且对数据获取速率要求不高的业务场景。 表2 桶策略 桶策略 说明 私有 桶的所有者拥有完全控制权限,其他用户在未经授权的情况下均无访问权限。 公共读 任何用户都可以对桶内对象进行读操作,仅桶所有者可以进行写操作。 公共读写 任何用户都可以对桶内对象进行读/写/删除操作。 区域选择需要与使用的媒体处理服务的区域一致,若使用“华北-北京四”的媒体处理服务,则需要创建“华北-北京四”的桶。 如果输入文件和输出文件分别以不同的桶进行存储时,结合媒体处理服务的业务特性,推荐存储输入文件的桶设置为“低频访问存储”,存储输出文件的桶设置为“标准存储”。 配置输入文件夹。 单击步骤3中输入桶的桶名称,跳转至该桶的详情页。 界面自动跳转至“对象”页面的“对象”页签。 单击“新建文件夹”,配置媒体处理服务的输入文件夹。 图1 新建文件夹 配置输出文件夹。与步骤5类似。 单击步骤3中输出桶的桶名称,跳转至该桶的详情页。 在“对象”页面,单击“新建文件夹”,配置媒体处理服务输出文件夹。 上传音视频文件。 进入输入桶页面,单击输入文件夹的名称,进入输入文件夹路径。 单击“上传对象”,选择需要上传的视频文件。 选择上传文件的存储类别和加密方式,单击“上传”。
  • 消息通知 json格式说明 订阅事件的json消息字段如表1所示。 表1 json消息体字段说明 参数 类型 说明 event_type String 事件类型。 当前支持的取值如下: TranscodeComplete:转码完成 TranscodeStart:转码启动,排完队,正式开始转码时触发此事件 ThumbnailComplete:截图完成 RemuxComplete:转封装完成 AnimatedGraphicsComplete:生成动图完成 ParseComplete:属性解析完成 transcode_info TranscodeInfo 转码信息,仅当是转码完成事件或转码启动事件才有该字段。 thumbnail_info ThumbnailInfo 截图信息,仅当是截图事件才有该字段。 animated_graphics_info AnimatedGraphicsInfo 动图信息,仅当是生成动图事件才有该字段。 remux_info RemuxInfo 转封装信息,仅当是转封装事件才有该字段。 表2 TranscodeInfo参数说明 参数 类型 说明 task_id string 任务ID。 status tring 事件状态。 TRANSCODING:转码启动 SUCCEED:转码成功 FAILED:转码失败 create_time string 任务创建时间。 start_time string 启动时间,指任务排完对正式开始执行的时间。 end_time string 任务结束时间。 intput FileAddress 转码文件输入地址。 output FileAddress 转码文件输出地址。 description string 任务描述。 media_detail MediaDetail 转码详细信息,失败时没有该字段。 表3 MediaDetail参数说明 参数 类型 说明 features String[] 任务名称。 origin_para OriginPara 原始片源信息。 output_video_paras OutputVideoPara[] 多路输出片源信息。 output_watermark_para OutputWatermarkPara 输出水印信息。 表4 OriginPara参数说明 参数 类型 说明 duration Integer 片源时长。 file_format String 文件格式。 video Video 原始片源视频信息。 audio Audio 原始片源音频信息。 表5 Video参数说明 参数 类型 说明 width Integer 视频宽度。 height Integer 视频高度。 bitrate Integer 视频码率。 frame_rate Integer 视频帧率。 codec string 视频编码格式。 表6 Audio参数说明 参数 类型 说明 codec string 音频编码格式。 sample Integer 音频采样率。 channels Integer 音频信道。 bitrate Integer 音频码率。 表7 OutputVideoPara参数说明 参数 类型 说明 template_id Integer 输出视频对应的模板ID。 size Integer 视频大小。 pack string 视频封装格式。 video Video 输出片源视频信息。 audio Audio 输出片源音频信息。 file_name string 输出片源文件名。 conver_duration double 折算时长。 error Error 错误信息。 表8 OutputWatermarkPara参数说明 参数 类型 说明 time_duration Int32 水印时长。 表9 AnimatedGraphicsInfo参数说明 参数 类型 说明 task_id String 任务ID status String 事件状态。 SUCCEED:生成动图成功 FAILED:生成动图失败 create_time String 任务创建时间。 start_time String 任务启动时间,指任务排完对正式开始执行的时间。 end_time String 任务结束时间。 description String 任务描述,如当任务异常时,此字段为异常的具体信息。 input FileAddress 源文件信息。 output FileAddress 输出文件信息。 output_param AnimatedGraphicsOutputParam 动图输出参数。 表10 FileAddress参数说明 参数名 类型 说明 location String 对象存储桶所在区域。 bucket String 对象存储桶名。 object String 文件的存储路径。 当用于“input”时,需要指定到具体对象。 当用于“output”时,只需指定到转码结果期望存放的路径。 file_name String 文件名,仅用于“output”输出。 当指定了此参数时,输出的对象名为“object/file_name”; 当不指定此参数时,输出的对象名为“object/xxx”,其中xxx由系统指定。 表11 AnimatedGraphicsOutputParam参数说明 名称 类型 说明 format String 动图格式。目前仅支持输出GIF文件。 width Integer 输出动图的宽。 height Integer 输出动图的高。 start Integer 起始时间。 单位:毫秒。 end Integer 结束时间。 frame_rate Integer 动图帧率。 表12 ThumbnailInfo参数说明 参数 类型 说明 task_id string 任务Id。 status tring 事件状态。 SUCCEED:截图成功。 FAILED:截图失败。 create_time string 开始时间。 start_time String 启动时间,指任务排完后正式开始执行的时间。 end_time string 结束时间。 intput FileAddress 源文件地址。 output FileAddress 截图文件输出地址。 description string 任务描述。 output_file_name String 输出文件名。 thumbnail_info PicInfo[] 截图详细信息,失败时没有该字段。 表13 PicInfo参数说明 参数 类型 说明 pic_name String 截图文件名。 表14 RemuxInfo参数说明 参数 类型 说明 task_id String 任务ID。 status String 事件状态。 SUCCEED:转封装成功。 FAILED:转封装失败。 create_time String 任务创建时间。 start_time String 任务启动时间,指任务排完对正式开始执行的时间。 end_time String 任务结束时间。 description String 任务描述,如当任务异常时,此字段为异常的具体信息。 input FileAddress 源文件信息。 output FileAddress 输出文件信息。 output_param RemuxOutputParam 转封装输出参数。 表15 RemuxOutputParam参数说明 参数名 类型 说明 format String 输出格式。 取值如下: HLS MP4 segment_duration Integer 分片时长,仅当format为“HLS”时有效。 取值范围:[2,10]。 默认值: 5。 单位:秒。 父主题: 附录
  • 修订记录 发布日期 修订记录 2022-03-30 第三次正式发布。 本次更新说明如下: 新增“搬迁音视频文件至华为云VOD”章节。 2023-11-30 第二次正式发布。 本次更新说明如下: 新增“H.264和H.265高清低码帮助视频网站打造极致体验”章节 新增“MPC的视频截图能力帮助视频网站客户快速构建媒体处理平台”章节 新增“MPC的视频转封装能力帮助在线教育客户实现多终端播放视频”章节 2022-11-30 第一次正式发布。
  • 在费用中心续费 登录管理控制台。 单击“控制台”页面上方“费用”,在下拉菜单中选择“续费管理”。进入“续费管理”页面。 自定义查询条件。 可在“手动续费项”“自动续费项”“到期转按需项”“到期不续费项”页签查询全部待续费资源,对资源进行手动续费的操作。 图2 续费管理 所有需手动续费的资源都可归置到“手动续费项”页签,具体操作请参见如何恢复为手动续费。 手动续费资源。 单个续费:在资源页面找到需要续费的资源,单击操作列的“续费”。 图3 单个续费 批量续费:在资源页面勾选需要续费的资源,单击列表左上角的“批量续费”。 图4 批量续费 选择云手机的续费时长,判断是否勾选“统一到期日”,将云手机到期时间统一到各个月的某一天。确认配置费用后单击“去支付”。 图5 续费确认 进入支付页面,选择支付方式,确认付款,支付订单后即可完成续费。
  • 计费模式概述 云手机服务提供包年/包月、按需计费两种计费模式,以满足不同场景下的用户需求。 包年/包月:一种预付费模式,即先付费再使用,按照订单的购买周期进行结算。一般适用于设备需求量长期稳定的成熟业务。 按需计费:一种后付费模式,即先使用再付费,按照云手机的实际使用时长计费,秒级计费,按小时结算。按需计费模式允许您根据实际业务需求灵活地调整资源使用,无需提前预置资源,从而降低预置过多或不足的风险。一般适用于设备需求量瞬间大幅波动的场景。 表1列出了计费模式的信息两种计费模式的区别。 表1 计费模式 计费模式 包年/包月 按需计费 付费方式 预付费,按照订单的购买周期结算。 后付费,按照云手机服务实际使用时长计费。 计费周期 按订单的购买周期计费。 秒级计费,按小时结算。 适用计费项 实例规格、实例数量、购买时长。 实例规格、实例数量、使用时长。 关机计费 按订单的购买周期计费。云手机实例关机对包年/包月计费无影响。 停止计费需手动删除实例。云手机实例关机后,正常计费。 变更计费模式 不支持变更为按需计费模式。 不支持变更为包年/包月计费模式。 变更规格 不支持变更实例规格。 不支持变更实例规格。 适用场景 适用于可预估资源使用周期的场景,价格比按需计费模式更优惠。对于长期使用者,推荐该方式。 适用于计算资源需求波动的场景,可以随时开通,随时删除。 父主题: 计费模式
  • 续费相关的功能 包年/包月计费模式云手机续费相关的功能如表1所示。 表1 续费相关的功能 功能 说明 手动续费 包年/包月计费模式云手机从购买到被自动删除之前,您可以随时在KooPhone控制台为云手机续费,以延长云手机的使用时间。 在一台包年/包月计费模式云手机生命周期的不同阶段,您可以根据需要选择一种方式进行续费,具体如图1所示。 图1 云手机生命周期 云手机从购买到到期前,处于正常运行阶段,资源状态为“运行中”。 到期后,资源状态变为“已过期”。 到期未续费时,云手机首先会进入宽限期,宽限期到期后仍未续费,资源状态变为“已冻结”。 超过宽限期仍未续费将进入保留期,如果保留期内仍未续费,资源将被自动删除。 华为云根据客户等级定义了不同用户的宽限期和保留期时长。
  • 计费示例 假设您在2023/02/08 15:50:04购买了一台包年/包月云手机(规格:专业版 2核 4GB内存 16GB存储)。购买时长为一个月,并在到期前手动续费1个月,则: 第一个计费周期为:2023/02/08 15:50:04 ~ 2023/03/08 23:59:59 第二个计费周期为:2023/03/09 00:00:00 ~ 2023/04/08 23:59:59 您需要为每个计费周期预先付费,总费用=实例规格单价 * 购买时长 * 购买数量。
  • 到期后影响 图1描述了包年/包月计费模式KooPhone资源各个阶段的状态。购买后,在计费周期内资源正常运行,此阶段为有效期;资源到期而未续费时,将陆续进入宽限期和保留期。 图1 包年/包月计费模式KooPhone资源生命周期 到期预警 包年/包月计费模式KooPhone资源在到期前第7天内,系统将向用户推送到期预警消息。预警消息将通过邮件、短信和站内信的方式通知到华为云账号的创建者。 到期后影响 当您的包年/包月计费模式KooPhone资源到期未续费,首先会进入宽限期,资源状态变为“已过期”。宽限期内您可以正常访问云手机。 如果您在宽限期内仍未续费包年/包月计费模式KooPhone资源,那么就会进入保留期,资源状态变为“已冻结”,您将无法对处于保留期的包年/包月资源执行任何操作。 保留期满仍未续费或充值,那么存储在KooPhone云手机实例中的数据将被删除,数据无法恢复,对应的云手机实例将被释放。 华为云根据客户等级定义了不同用户的宽限期和保留期时长。 关于续费的详细介绍请参见续费概述。
  • 适用场景 包年/包月计费模式需要用户预先支付一定时长的费用,适用于长期、稳定的业务需求。以下是一些适用于包年/包月计费模式的业务场景: 稳定业务需求:对于长期运行且资源需求相对稳定的业务,如企业客服远程协同、日常办公等,包年/包月计费模式能提供较高的成本效益。 长期项目:对于周期较长的项目,如政务项目、云游戏策划等,包年/包月计费模式可以确保在整个项目周期内资源的稳定使用。 业务高峰预测:如果能预测到业务高峰期,如促销季、节假日等,可提前购买包年/包月资源以应对高峰期的需求,避免资源紧张。 数据安全要求高:对于对数据安全性要求较高的业务,包年/包月计费模式可确保资源的持续使用,降低因资源欠费而导致的数据安全风险。
  • 计费说明 云手机服务的计费项由云手机实例规格、实例数量、购买时长或使用时长进行计费。具体内容如表1所示。 表1 云手机服务计费项 计费项 计费项说明 适用的计费模式 计费费用 实例规格 计费因子:vCPU和内存,不同规格的实例类型提供不同的计算和存储能力。 包年/包月、按需计费 相同实例规格企业版比专业版价格更高。 实例数量 购买云手机实例的数量。 包年/包月、按需计费 总费用随着实例数量线性增加。 购买时长 包周期模式下购买云手机实例的时长。 包年/包月 总费用随着购买时长的增加线性增加。 如:包2个月的费用是包1个月的2倍。
  • 计费示例 假设您在2023/04/18 9:59:30购买了一台按需计费的云手机(规格:专业版 2核 4GB内存 16GB存储),然后在2023/04/18 10:45:46将其删除,则: 第一个计费周期为9:00:00 ~ 10:00:00,在9:59:30 ~ 10:00:00间产生费用,该计费周期内的计费时长为30秒。 第二个计费周期为10:00:00 ~ 11:00:00,在10:00:00 ~ 10:45:46间产生费用,该计费周期内的计费时长为2746秒。 在购买云手机时的“配置费用”中标出了资源的每小时价格,如果您需要核对费用,请将每小时价格除以3600,得到每秒价格。总费用=实例每秒价格 * 使用时长 * 购买数量。
  • ER自定义策略样例 示例1:授权用户创建企业路由器、删除企业路由器 { "Version": "1.1", "Statement": [ { "Effect": "Allow", "Action": [ "er:instances:create", "er:instances:delete" ] } ] } 示例2:拒绝用户删除企业路由器 拒绝策略需要同时配合其他策略使用,否则没有实际作用。用户被授予的策略中,一个授权项的作用如果同时存在Allow和Deny,则遵循Deny优先原则。 如果您给用户授予ER FullAccess的系统策略,但不希望用户拥有ER FullAccess中定义的删除企业路由器的权限,您可以创建一条拒绝删除企业路由器的自定义策略,然后同时将ER FullAccess和拒绝策略授予用户,根据Deny优先原则,则用户可以对ER执行除了删除企业路由器外的所有操作。拒绝策略示例如下: { "Version": "1.1", "Statement": [ { "Effect": "Deny", "Action": [ "er:instances:delete" ] } ] } 示例3:添加多个授权项策略 一个自定义策略中可以包含多个授权项,且除了可以包含本服务的授权项外,还可以包含其他服务的授权项,可以包含的其他服务必须跟本服务同属性,即都是项目级服务或都是全局级服务。多个授权语句策略描述如下: { "Version": "1.1", "Statement": [ { "Effect": "Allow", "Action": [ "er:*:get*", "er:*:list*", "vpc:vpcs:get", "vpc:vpcs:list", "vpc:subnets:get", "vpc:subnets:list", "dcaas:vgw:get", "dcaas:vgw:list", "cc:networkInstances:get", "cc:networkInstances:list", "cc:cloudConnections:get", "cc:cloudConnections:list" ] } ] }
  • 响应示例 状态码: 200 返回信息。 { "status" : "200", "message" : "success", "data" : [ { "id" : "1865d1ac-fa0d-468d-a18e-e05b73705f57", "callback_url" : "https://www.example.com/v1/send-resolve-status", "url_type" : 0 } ] }
共100000条