Astral 360 Astral Toolbox

Search And Replace

Recherche-remplacement MySQL respectant les données sérialisées, avec simulation, sauvegardes automatiques et restauration en un clic.

Version 1.0.0 · Extension Store · requiert PHP 7.4+ avec mysqli Rechercher et remplacer en toute sécurité des chaînes (y compris des domaines) dans des bases MySQL, en respectant les données sérialisées, avec simulation, sauvegardes automatiques et restauration.

Search And Replace réécrit des chaînes dans une base MySQL sans corrompre les données sérialisées — le classique problème de migration WordPress. Les valeurs sérialisées PHP voient leurs préfixes de longueur régénérés, les colonnes JSON sont ré-encodées, le texte simple est remplacé directement. Chaque exécution en écriture est précédée d'un mysqldump gzippé obligatoire, restaurable en un clic.

Usages typiques : migrations de domaine (ancien → nouveau domaine à travers wp_options, wp_postmeta, constructeurs de pages…), et remplacements de texte littéral en masse.


Onglet Run

Search And Replace — Run

Le flux suit quatre étapes numérotées sur une seule page :

1. Database

Champ Défaut Notes
Host localhost Nom d'hôte ou IP.
Database name Lettres, chiffres, _, $, - seulement (max 64 caractères).
User / Password Identifiants MySQL.

Les identifiants ne sont jamais stockés — ni sur le disque, ni en session, ni dans les cookies. Ils vivent en mémoire PHP le temps de chaque requête et dans la mémoire de votre navigateur pour la durée de vie de la page (pour que la fenêtre Restore puisse les pré-remplir). Les champs bloquent activement l'autofill des gestionnaires de mots de passe, pour éviter l'injection de mauvais identifiants.

Cliquez Connect & list tables — l'extension introspecte le schéma et révèle les étapes 3 et 4.

2. Quoi remplacer

Deux modes (boutons radio) :

  • Domain (recommandé) — saisissez l'ancien domaine et le nouveau domaine nus (sans protocole, sans www.). L'outil les déploie en six variantes d'URL trouvées dans les bases réelles — https://www., http://www., //www., https://, http://, // — appliquées dans un ordre sûr, avec un aperçu en direct des motifs exacts.
    • Force HTTPS on rewritten URLs (coché par défaut) : chaque variante réécrit vers https:// ; décochez pour préserver le protocole d'origine de chaque URL.
  • Raw string — une seule paire recherche/remplacement littérale (pas de regex). Le PHP sérialisé et le JSON restent gérés de façon transparente.

3. Tables et colonnes

Une liste à cocher de chaque table (avec nombre de lignes, taille, moteur), toutes cochées par défaut. Dépliez une table pour basculer ses colonnes texte individuelles (CHAR/VARCHAR/TEXT/JSON — les colonnes BLOB/BINARY ne sont jamais touchées). Les tables sans clé primaire sont listées mais sautées (aucun UPDATE sûr possible) avec un avertissement.

4. Run

  • Dry-run (preview only) — analyse tout, ne modifie rien, et montre ce qui serait changé.
  • Run with backup — prend d'abord le mysqldump, puis applique les changements. Une fenêtre de confirmation exige que vous tapiez le nom de la base avant que le bouton se déverrouille.

Résultats

Après l'une ou l'autre opération : un résumé (changements trouvés, tables touchées, durée), une ventilation par table avec des fenêtres View changes, une grille d'échantillons avant/après (tronqués à 200 caractères), les avertissements éventuels (tables sautées, etc.), et — après une vraie exécution — le nom de la sauvegarde créée.

La progression est interrogée chaque seconde pendant les longues analyses (table courante, lignes analysées/modifiées). Un verrou empêche deux opérations simultanées.


Onglet Backups

Search And Replace — Backups

Chaque entrée est le mysqldump pris juste avant un Run.

  • Résumé du stockage — nombre de sauvegardes et taille totale. Les sauvegardes de plus de 7 jours sont supprimées automatiquement (vérifié à chaque chargement de page).
  • Par sauvegarde : base, horodatages créé/expire, taille, l'opération qu'elle a précédée (mode + chaînes recherche/remplacement), et :
    • Download — le .sql.gz brut.
    • Restore — ouvre une fenêtre (identifiants pré-remplis depuis votre dernière connexion si disponible, confirmation par saisie du nom de la base). Restaurer supprime et recrée les tables du dump, puis réimporte toutes les lignes — les changements faits après la sauvegarde sont perdus.
    • Delete — permanent (avec confirmation).

Ce que contient une sauvegarde

mysqldump --single-transaction --quick --routines --triggers --events --skip-lock-tables --no-tablespaces --set-charset --default-character-set=utf8mb4, compressé en gzip (niveau 6), nommé <dbname>-AAAAMMJJ-HHMMSS.sql.gz, stocké root seulement sous extensions/search-and-replace/var/backups/. Le dump et la restauration ont chacun un plafond de délai d'une heure.


Comment les remplacements restent sûrs

Forme des données Traitement
PHP sérialisé (s:14:"http://old.com";) Désérialisé avec allowed_classes => false (aucune instanciation d'objet), chaînes remplacées récursivement, re-sérialisé — préfixes de longueur régénérés. Les cellules contenant des objets sérialisés retombent sur un remplacement brut avec un avertissement.
JSON Décodé, chaînes remplacées récursivement, ré-encodé.
Texte simple Remplacement littéral direct, dans l'ordre des variantes.

Autres garde-fous :

  • Les identifiants (base/table/colonne) validés contre une liste blanche stricte et contre le schéma en direct.
  • Les UPDATE s'exécutent en transactions, validées toutes les 500 lignes ; les lignes sont diffusées (usage mémoire stable sur d'énormes tables).
  • Le mot de passe MySQL est passé à mysqldump/mysql via un fichier temporaire --defaults-extra-file en 0600 — jamais sur la ligne de commande (invisible à ps).
  • Les chaînes recherche et remplacement doivent différer ; une recherche vide est refusée.

Défauts et limites (settings.default.json)

Réglage Défaut
Taille d'échantillon en dry-run (par table) 50
Niveau de compression des sauvegardes (gzip) 6
Rétention des sauvegardes 7 jours
Longueur d'aperçu avant/après 200 caractères
Taille de lot d'UPDATE (lignes par transaction) 500
Délai de connexion MySQL 5 s

(la v1.0.0 n'a pas d'interface de réglages — ceux-ci s'ajustent dans config/settings.default.json de l'extension au besoin.)

Carte des données et fichiers

Chemin Rôle
extensions/search-and-replace/var/backups/ Dumps .sql.gz (0600, dossier 0700)
extensions/search-and-replace/var/history.json Journal d'audit — chaque backup/restore/run/dry-run, plafonné à 500 entrées
extensions/search-and-replace/var/operation.lock / operation-status.json Verrou d'exécution / progression en direct (éphémère)