Heim > Datenbank > MySQL-Tutorial > Hauptteil

Werfen Sie einen Blick auf die neuen Funktionen des MySQL 8 Clone Plugin

coldplay.xixi
Freigeben: 2020-10-29 17:30:24
nach vorne
1962 Leute haben es durchsucht

MySQL-Video-Tutorial In der Spalte „Clone Plugin“ wird die neue Funktion von MySQL 8 vorgestellt. Persönlich dient es hauptsächlich der Gruppenreplikation. Bei der Gruppenreplikation wird ein neuer Knoten hinzugefügt und die Differenzdaten werden durch verteilte Wiederherstellung (Distributed Recovery) vervollständigt.

Vor MySQL 8.0.17 wurde nur eine Wiederherstellungsmethode unterstützt – Binlog. Wenn jedoch das für den neuen Knoten erforderliche Binlog gelöscht wurde, können Sie zu diesem Zeitpunkt nur Sicherungstools (XtraBackup, mydumper, mysqldump) verwenden, um die gesamte Datenmenge zu synchronisieren, und dann die inkrementellen Daten durch verteilte Wiederherstellung synchronisieren.

Werfen Sie einen Blick auf die neuen Funktionen des MySQL 8 Clone PluginObwohl diese Methode auch den Zweck des Hinzufügens von Knoten erreichen kann, erfordert sie dennoch die Hilfe externer Tools, was einen gewissen Arbeitsaufwand und einen gewissen Nutzungsschwellenwert erfordert. Sie sollten wissen, dass sein Konkurrent PXC standardmäßig XtraBackup für die Status-Snapshot-Übertragung integriert (ähnlich der vollständigen Synchronisierung), während MongoDB noch einen Schritt weiter geht und Initial Sync nativ implementiert, um vollständige Daten zu synchronisieren. Aus Sicht der Benutzerfreundlichkeit ist MySQL in Bezug auf das Hinzufügen von Knoten zum Cluster tatsächlich seinen Konkurrenten unterlegen. Was das Kundenerlebnis angeht, gibt es noch viel Raum für Verbesserungen.

Glücklicherweise haben auch die MySQL-Verantwortlichen diese Lücke erkannt und schließlich das Clone Plugin in MySQL 8.0.17 implementiert. Für Beamte ist es natürlich nicht schwierig, diese Funktion zu implementieren. Schließlich gibt es ein fertiges physisches Backup-Tool (MySQL Enterprise Backup) als Referenz.

Dieser Artikel beginnt mit den folgenden Aspekten:

Installation des Klon-Plugins

Verwendung des Klon-Plugins

So überprüfen Sie den Fortschritt des Klonvorgangs
  1. So erstellen Sie eine Slave-Bibliothek basierend auf Klondaten
  2. Implementierung Details zum Clone Plugin
  3. Einschränkungen des Clone Plugins
  4. Vergleich von Clone Plugin und 1) Spezifikation der Konfigurationsdatei
  5. [mysqld]
    plugin-load-add=mysql_clone.so
    clone=FORCE_PLUS_PERMANENT复制代码
    Nach dem Login kopieren
    Nach dem Login kopieren
  6. Der Klon hier ist streng genommen nicht der Parametername, sondern der Plug-In-Name, der hinzugefügt werden kann oder nicht. FORCE_PLUS_PERMANENT steuert das Verhalten des Plug-Ins.
  7. Es gibt vier Werte:
  8. ON** (**Plug-in aktivieren)
OFF (Plug-in deaktivieren)

FORCE (Öffnen erzwingen. Wenn die Plug-in-Initialisierung fehlschlägt, wird MySQL dies nicht tun start)

FORCE_PLUS_PERMANENT (In FORCE ist es nicht erlaubt, Plug-Ins über den Befehl UNINSTALL PLUGIN zu deinstallieren).

(2) Dynamisches Laden

[mysqld]
plugin-load-add=mysql_clone.so
clone=FORCE_PLUS_PERMANENT复制代码
Nach dem Login kopieren
Nach dem Login kopieren
Überprüfen Sie, ob das Plug-in erfolgreich installiert wurde

mysql> show plugins;
...
| clone                           | ACTIVE   | CLONE              | mysql_clone.so | GPL     |
...复制代码
Nach dem Login kopieren
Der Klonstatus wird als „AKTIV“ angezeigt, was bedeutet, dass das Plug-in erfolgreich geladen wurde.
  • 2. Verwendung des Klon-Plugins
  • Das Klon-Plugin unterstützt zwei Klonmethoden: lokales Klonen und Remote-Klonen.
  • 1. Lokales Klonen

Lokales Klonen wird lokal auf der Instanz initiiert und seine Syntax lautet wie folgt:

CLONE LOCAL DATA DIRECTORY [=] 'clone_dir';复制代码
Nach dem Login kopieren
Dabei ist clone_dir das Klonverzeichnis.

Sehen Sie sich unten eine spezifische Demo an. „Erstellen Sie einen Klonbenutzer.“

Das Klonverzeichnis muss ein absoluter Pfad sein.

"/data/mysql" muss vorhanden sein und MySQL verfügt über Schreibberechtigungen dafür.

3307 kann nicht existieren.

Den Inhalt des Klonverzeichnisses anzeigen

mysql> create user 'clone_user'@'%' identified by 'clone_pass';
mysql> grant backup_admin on *.* to 'clone_user'@'%';复制代码
Nach dem Login kopieren
Im Vergleich zu Xtrabackup ist keine Vorbereitung erforderlich und es kann direkt gestartet werden.
# mkdir /data/mysql
# chown -R mysql.mysql /data/mysql复制代码
Nach dem Login kopieren

2. Beim Remote-Klonen handelt es sich um zwei Instanzen, die geklont werden sollen, und die Instanz, die geklonte Daten akzeptiert. Der Klonbefehl muss auf dem Empfänger initiiert werden und die Syntax lautet wie folgt:

# mysql -uclone_user -pclone_pass
mysql> clone local data directory='/data/mysql/3307';复制代码
Nach dem Login kopieren

Dabei sind Host und Port die IP und der Port der zu klonenden Instanz (Spender), Benutzer und Passwort sind der Klonbenutzer und Passwort für den Spender und die Berechtigung „backup_admin“ sind erforderlich, wie oben. „Clone_user“ erstellt.

DATENVERZEICHNIS gibt das Sicherungsverzeichnis an. Wenn es nicht angegeben wird, wird es standardmäßig in das Datenverzeichnis des Empfängers geklont.

REQUIRE [NO] SSL, ob SSL-Kommunikation aktiviert werden soll.

Schauen Sie sich unten die spezifische Demo an.

Erstellen Sie zunächst einen Klonbenutzer auf der Donor-Instanz und laden Sie das Klon-Plugin.

# ll /data/mysql/3307
total 172996
drwxr-x--- 2 mysql mysql       89 May 24 22:37 #clone
-rw-r----- 1 mysql mysql     3646 May 24 22:37 ib_buffer_pool
-rw-r----- 1 mysql mysql 12582912 May 24 22:37 ibdata1
-rw-r----- 1 mysql mysql 50331648 May 24 22:37 ib_logfile0
-rw-r----- 1 mysql mysql 50331648 May 24 22:37 ib_logfile1
drwxr-x--- 2 mysql mysql        6 May 24 22:37 mysql
-rw-r----- 1 mysql mysql 25165824 May 24 22:37 mysql.ibd
drwxr-x--- 2 mysql mysql       20 May 24 22:37 slowtech
drwxr-x--- 2 mysql mysql       28 May 24 22:37 sys
-rw-r----- 1 mysql mysql 10485760 May 24 22:37 undo_001
-rw-r----- 1 mysql mysql 11534336 May 24 22:37 undo_002复制代码
Nach dem Login kopieren

backup_admin ist die erforderliche Berechtigung für den Klonvorgang.

Als nächstes erstellen Sie einen Klonbenutzer auf der Empfängerinstanz und laden das Klon-Plugin.
    mysql> create user 'recipient_user'@'%' identified by 'recipient_pass';
    mysql> grant clone_admin on *.* to 'recipient_user'@'%';
    mysql> install plugin clone soname 'mysql_clone.so';复制代码
    Nach dem Login kopieren

    这里的clone_admin,隐式含有backup_admin(阻塞DDL)和shutdown(重启实例)权限。

    设置Donor白名单。Recipient只能克隆白名单中的实例。

    mysql> set global clone_valid_donor_list = '192.168.244.10:3306';复制代码
    Nach dem Login kopieren

    设置该参数需要SYSTEM_VARIABLES_ADMIN权限。

    在Recipient上发起克隆命令

    # mysql -urecipient_user -precipient_pass
    mysql> clone instance from 'donor_user'@'192.168.244.10':3306 identified by 'donor_pass';
    Query OK, 0 rows affected (36.97 sec)复制代码
    Nach dem Login kopieren

    远程克隆会依次进行以下操作:

    **(1)****获取备份锁。**备份锁和DDL互斥。注意,不仅仅是Recipient,Donor上的备份锁同样会获取。

    **(2)****DROP用户表空间。**注意,DROP的只是用户数据,不是数据目录,也不包括mysql,ibdata等系统表空间。

    **(3)从Donor实例拷贝数据。**对于用户表空间,会直接拷贝,如果是系统表空间 ,则会重命名为xxx.#clone,不会直接替代原文件。

     ll /data/mysql/3306/data/
    ...
    -rw-r----- 1 mysql mysql     3646 May 25 07:20 ib_buffer_pool
    -rw-r----- 1 mysql mysql     3646 May 27 07:31 ib_buffer_pool.#clone
    -rw-r----- 1 mysql mysql 12582912 May 27 07:31 ibdata1
    -rw-r----- 1 mysql mysql 12582912 May 27 07:31 ibdata1.#clone
    -rw-r----- 1 mysql mysql 50331648 May 27 07:32 ib_logfile0
    -rw-r----- 1 mysql mysql 50331648 May 27 07:31 ib_logfile0.#clone
    ...
    -rw-r----- 1 mysql mysql 25165824 May 27 07:31 mysql.ibd
    -rw-r----- 1 mysql mysql 25165824 May 27 07:31 mysql.ibd.#clone
    ...复制代码
    Nach dem Login kopieren

    **(4)重启实例。**在启动的过程中,会用xxx.#clone替换掉原来的系统表空间文件。

    三、如何查看克隆操作的进度

    查看克隆操作的进度主要依托于performance_schema.clone_status和performance_schema.clone_progress这两张表。

    首先看看performance_schema.clone_status表。

    mysql> select * from performance_schema.clone_status\G
    *************************** 1\. row ***************************
                 ID: 1
                PID: 0
              STATE: Completed
         BEGIN_TIME: 2020-05-27 07:31:24.220
           END_TIME: 2020-05-27 07:33:08.185
             SOURCE: 192.168.244.10:3306
        DESTINATION: LOCAL INSTANCE
           ERROR_NO: 0
      ERROR_MESSAGE:
        BINLOG_FILE: mysql-bin.000009
    BINLOG_POSITION: 665197555
      GTID_EXECUTED: 59cd4f8f-8fa1-11ea-a0fe-000c29f66609:1-560
    1 row in set (0.06 sec)复制代码
    Nach dem Login kopieren

    顾名思义,该表记录了克隆操作的当前状态。

    其中,

  • **PID:**Processlist ID。对应show processlist中的Id,如果要终止当前的克隆操作,执行kill processlist_id命令即可。

  • **STATE:**克隆操作的状态,Not Started(克隆尚未开始),In Progress(克隆中),Completed(克隆成功),Failed(克隆失败)。如果是Failed状态,ERROR_NO,ERROR_MESSAGE会给出具体的错误编码和错误信息。

  • **BEGIN_TIME,END_TIME:**克隆操作开始,结束时间。

  • **SOURCE:**Donor实例的地址。

  • **DESTINATION:**克隆目录。“LOCAL INSTANCE”代表当前实例的数据目录。

  • **GTID_EXECUTED,BINLOG_FILE(BINLOG_POSITION):**克隆操作结束时,主库已经执行的GTID集合,及一致性位置点。可利用这些信息来搭建从库。

接下来看看performance_schema.clone_progress表。

mysql> select * from performance_schema.clone_progress;
+------+-----------+-----------+----------------------------+----------------------------+---------+-----------+-----------+-----------+------------+---------------+
| ID   | STAGE     | STATE     | BEGIN_TIME                 | END_TIME                   | THREADS | ESTIMATE  | DATA      | NETWORK   | DATA_SPEED | NETWORK_SPEED |
+------+-----------+-----------+----------------------------+----------------------------+---------+-----------+-----------+-----------+------------+---------------+
|    1 | DROP DATA | Completed | 2020-05-27 07:31:28.581661 | 2020-05-27 07:31:35.855706 |       1 |         0 |         0 |         0 |          0 |             0 |
|    1 | FILE COPY | Completed | 2020-05-27 07:31:35.855952 | 2020-05-27 07:31:58.270881 |       2 | 482463294 | 482463294 | 482497011 |          0 |             0 |
|    1 | PAGE COPY | Completed | 2020-05-27 07:31:58.271250 | 2020-05-27 07:31:58.719085 |       2 |  10977280 |  10977280 |  11014997 |          0 |             0 |
|    1 | REDO COPY | Completed | 2020-05-27 07:31:58.720128 | 2020-05-27 07:31:58.930804 |       2 |    465408 |    465408 |    465903 |          0 |             0 |
|    1 | FILE SYNC | Completed | 2020-05-27 07:31:58.931094 | 2020-05-27 07:32:01.063325 |       2 |         0 |         0 |         0 |          0 |             0 |
|    1 | RESTART   | Completed | 2020-05-27 07:32:01.063325 | 2020-05-27 07:32:59.844119 |       0 |         0 |         0 |         0 |          0 |             0 |
|    1 | RECOVERY  | Completed | 2020-05-27 07:32:59.844119 | 2020-05-27 07:33:08.185367 |       0 |         0 |         0 |         0 |          0 |             0 |
+------+-----------+-----------+----------------------------+----------------------------+---------+-----------+-----------+-----------+------------+---------------+
7 rows in set (0.00 sec)复制代码
Nach dem Login kopieren

该表记录了克隆操作的进度信息。

  • **STAGE:**一个克隆操作可依次细分为DROP DATA,FILE COPY,PAGE COPY,REDO COPY,FILE SYNC,RESTART,RECOVERY等7个阶段。当前阶段结束了才会开始下一个阶段。

  • **STATE:**当前阶段的状态。有三种状态:Not Started,In Progress,Completed。

  • **BEGIN_TIME,END_TIME:**当前阶段的开始时间和结束时间。

  • **THREADS:**当前阶段使用的并发线程数。

  • **ESTIMATE:**预估的数据量。

  • **DATA:**已经拷贝的数据量。

  • **NETWORK:**通过网络传输的数据量。如果是本地克隆,该列的值为0。

  • **DATA_SPEED,NETWORK_SPEED:**当前数据拷贝的速率和网络传输的速率。

    注意,是当前值。

四、如何基于克隆数据搭建从库

在前面,我们介绍过performance_schema.clone_status表,该表会记录Donor实例的一致性位置点信息。我们可以利用这些信息来搭建从库。

mysql> select * from performance_schema.clone_status\G
*************************** 1\. row ***************************
...
    BINLOG_FILE: mysql-bin.000009
BINLOG_POSITION: 665197555
  GTID_EXECUTED: 59cd4f8f-8fa1-11ea-a0fe-000c29f66609:1-560
1 row in set (0.06 sec)复制代码
Nach dem Login kopieren

这里,区分两种场景,GTID复制和基于位置点的复制。

1、GTID复制

mysql> CHANGE MASTER TO MASTER_HOST = 'master_host_name', MASTER_PORT = master_port_num,
       ...
       MASTER_AUTO_POSITION = 1;
mysql> START SLAVE;复制代码
Nach dem Login kopieren

需要注意的是,无需额外执行set global gtid_purged操作。通过克隆数据启动的实例,gtid_purged已经初始化完毕。

mysql> show global variables like 'gtid_purged';
+---------------+--------------------------------------------+
| Variable_name | Value                                      |
+---------------+--------------------------------------------+
| gtid_purged   | 59cd4f8f-8fa1-11ea-a0fe-000c29f66609:1-560 |
+---------------+--------------------------------------------+
1 row in set (0.00 sec)复制代码
Nach dem Login kopieren

2、基于位置点的复制

这里,同样要区分两种场景。

场景1,Recipient要作为Donor的从库。

mysql> SELECT BINLOG_FILE, BINLOG_POSITION FROM performance_schema.clone_status; 
mysql> CHANGE MASTER TO MASTER_HOST = 'master_host_name', MASTER_PORT = master_port_num,
       ...
       MASTER_LOG_FILE = 'master_log_name',
       MASTER_LOG_POS = master_log_pos;
mysql> START SLAVE;复制代码
Nach dem Login kopieren

其中,

master_host_name,master_port_num:Donor实例的IP和端口。

master_log_name,master_log_pos:performance_schema.clone_status 中的BINLOG_FILE, BINLOG_POSITION。

场景2,Donor本身就是一个从库,Recipient要作为Donor主库的从库。

mysql> SELECT MASTER_LOG_NAME, MASTER_LOG_POS FROM mysql.slave_relay_log_info;
mysql> CHANGE MASTER TO MASTER_HOST = 'master_host_name', MASTER_PORT = master_port_num,
       ...
       MASTER_LOG_FILE = 'master_log_name',
       MASTER_LOG_POS = master_log_pos;
mysql> START SLAVE;复制代码
Nach dem Login kopieren

其中,

master_host_name,master_port_num:Donor主库的IP和端口。

master_log_name,master_log_pos:mysql.slave_relay_log_info中的Master_log_name,Master_log_pos(分别对应 SHOW SLAVE STATUS 中的 Relay_Master_Log_File,Exec_Master_Log_Pos)。

在搭建从库时,建议设置--skip-slave-start。该参数默认为OFF,实例启动后,会自动执行START SLAVE操作。

如果Donor是个从库,Recipient会基于mysql.slave_master_info,mysql.slave_relay_log_info中的信息自动建立复制,很多时候,这未必是我们的预期行为。

五、Clone Plugin的实现细节

克隆操作可细分为以下5个阶段。

[INIT] ---> [FILE COPY] ---> [PAGE COPY] ---> [REDO COPY] -> [Done]复制代码
Nach dem Login kopieren

**1、INIT:**初始化一个克隆对象。

**2、FILE COPY:**拷贝所有数据文件。在拷贝之前,会记录一个LSN,作为“CLONE START LSN”,这个LSN其实是当前CHECKPOINT的LSN,同时启动“Page Tracking”特性。

“Page Tracking”会跟踪“CLONE START LSN”之后被修改的页,具体来说,会记录该页的Tablespace ID和page ID。数据文件拷贝结束后,会将当前CHECKPOINT的LSN记为“CLONE FILE END LSN”。

**3、PAGE COPY:**拷贝“CLONE START LSN”和“CLONE FILE END LSN”之间的页,在拷贝之前,会对这些页进行排序-基于Tablespace ID和page ID,尽量避免拷贝过程中出现随机读写。同时,开启“Redo Archiving”特性。

“Redo Archiving”会在后台开启一个归档线程将Redo文件中的内容按Chunk拷贝到归档文件中。通常来说,归档线程的拷贝速度会快于Redo日志的生成速度。即使慢于,在写入新的Redo日志时,也会等待归档线程完成拷贝,不会出现还未拷贝的Redo日志被覆盖的情况。当所有修改的页拷贝完毕后,会获取实例的一致性位置点信息,此时的LSN记为“CLONE LSN”。

4、REDO COPY:拷贝归档文件中“CLONE FILE END LSN”与“CLONE LSN”之间的Redo日志。

**5、Done:**调用snapshot_end()销毁克隆对象。

六、Clone Plugin的限制

1、克隆期间,不允许执行DDL命令。同样,DDL会阻塞克隆命令的执行

2、Clone Plugin不会拷贝Donor的配置参数。

3、Clone Plugin不会拷贝Donor的二进制日志文件。

4、Clone Plugin只会拷贝InnoDB表的数据,对于其它存储引擎的表,只会拷贝表结构。

5、Donor实例中如果有表通过DATA DIRECTORY指定了绝对路径,在进行本地克隆时,会提示文件已存在。在进行远程克隆时,绝对路径必须存在且有可写权限。

6、不允许通过MySQL Router连接Donor实例。

7、执行CLONE INSTANCE操作时,指定的Donor端口不能为X Protocol端口。

除此之外,在进行远程克隆时,还会进行如下检查:

  • MySQL版本(包括小版本)必须一致,且支持Clone Plugin。
ERROR 3864 (HY000): Clone Donor MySQL version: 8.0.20 is different from Recipient MySQL version 8.0.19.复制代码
Nach dem Login kopieren
  • 主机的操作系统和位数(32位,64位)必须一致。两者可根据version_compile_os,version_compile_machine参数获取。
  • Recipient必须有足够的磁盘空间存储克隆数据。
  • 字符集(character_set_server),校验集(collation_server),character_set_filesystem必须一致。
  • innodb_page_size必须一致。会检查innodb_data_file_path中ibdata的数量和大小。
  • 目前Clone Plugin(8.0.20)的实现,无论是Donor,还是Recipient,同一时间,只能执行一个克隆操作。后续会支持多个克隆操作并发执行。
ERROR 3634 (HY000): Too many concurrent clone operations. Maximum allowed - 1.复制代码
Nach dem Login kopieren
  • Recipient需要重启,所以其必须通过mysqld_safe或systemd等进行管理。如果是通过mysqld进行启动,实例关闭后,需要手动启动。
ERROR 3707 (HY000): Restart server failed (mysqld is not managed by supervisor process).复制代码
Nach dem Login kopieren
  • ACTIVE状态的Plugin必须一致。

七、Clone Plugin与XtraBackup的对比

1、在实现上,两者都有FILE COPY和REDO COPY阶段,但Clone Plugin比XtraBackup多了一个PAGE COPY,由此带来的好处是,Clone Plugin的恢复速度比XtraBackup更快。

2、XtraBackup没有Redo Archiving特性,有可能出现未拷贝的Redo日志被覆盖的情况。

3、GTID下建立复制,无需额外执行set global gtid_purged操作。

八、Clone Plugin的参数解析

  • clone_autotune_concurrency 是否自动调节克隆过程中并发线程数的数量,默认为ON,此时,最大线程数受clone_max_concurrency参数控制。若设置为OFF,则并发线程数的数量将是固定的,同clone_max_concurrency参数一致。该参数的默认值为16。
  • clone_buffer_size 本地克隆时,中转缓冲区的大小,默认4M。缓冲区越大,备份速度越快,相应的,对磁盘IO的压力越大。
  • clone_ddl_timeout 克隆操作需要获取备份锁(Backup Lock)。如果在执行CLONE命令时,有DDL在执行,则CLONE命令会被阻塞,等待获取备份锁(Waiting for backup lock)。等待的最大时长由clone_ddl_timeout参数决定,默认300(单位秒)。如果在这个时间内还没获取到锁,CLONE命令会失败,且提示“ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction”。

需要注意的是,如果在执行DDL时,有CLONE命令在执行,DDL同样会因获取不到备份锁被阻塞,只不过,DDL操作的等待时长由lock_wait_timeout参数决定,该参数的默认值为31536000s,即365天。

  • clone_enable_compression Remote-Klonen, ob die Komprimierung beim Übertragen von Daten aktiviert werden soll. Durch das Einschalten der Komprimierung kann zwar Netzwerkbandbreite gespart werden, die CPU-Auslastung steigt jedoch entsprechend.
  • clone_max_data_bandwidth Die maximal zulässige Datenkopierrate beim Remote-Klonen (Einheit: MiB/s). Der Standardwert ist 0, keine Begrenzung. Beachten Sie, dass die Grenze hier nur die Kopierrate eines einzelnen Threads ist. Wenn mehrere Threads parallel kopieren, ist die tatsächliche maximale Kopierrate = clone_max_data_bandwidth*Anzahl der Threads.
  • clone_max_network_bandwidth Die maximal zulässige Netzwerkübertragungsrate beim Remote-Klonen (Einheit: MiB/s). Der Standardwert ist 0, keine Begrenzung. Sollte es einen Engpass in der Netzwerkbandbreite geben, können Sie mit diesem Parameter die Geschwindigkeit begrenzen.
  • clone_valid_donor_list Legen Sie die Spender-Whitelist fest, und nur die in der Whitelist angegebenen Instanzen können geklont werden.
  • clone_ssl_ca, clone_ssl_cert, clone_ssl_key SSL-bezogen.

Verwandte kostenlose Lernempfehlungen: MySQL-Video-Tutorial

Das obige ist der detaillierte Inhalt vonWerfen Sie einen Blick auf die neuen Funktionen des MySQL 8 Clone Plugin. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:juejin.im
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!