如何将Drupal 9数据库迁移至自建MySQL并解密数据用于自定义站点
解决Drupal加密数据访问问题(自定义站点读取用户/图片/节点数据)
先明确加密类型
- 排查Drupal是否启用了
encrypt或类似字段加密模块:查看后台模块列表,或检查modules目录、settings.php文件(看是否有$settings['encryption_key']这类密钥配置)。 - 若无相关加密模块/配置,大概率是数据库层面的透明加密(如MySQL TDE、服务器磁盘加密)。
字段级加密(如encrypt模块)的处理方法
直接在Drupal环境内编写脚本解密并导出数据,这是最可靠的方式:
- 在Drupal根目录新建
decrypt_export.php文件,写入示例代码(根据实际加密字段调整):
define('DRUPAL_ROOT', getcwd()); require_once DRUPAL_ROOT . '/includes/bootstrap.inc'; drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); // 导出解密后的用户数据 $users = \Drupal\user\Entity\User::loadMultiple(); $export_data = []; foreach ($users as $user) { $export_row = [ 'uid' => $user->id(), 'username' => $user->get('name')->value, 'email' => $user->get('mail')->value, // 替换为实际加密字段,调用Drupal解密服务 'encrypted_profile' => \Drupal::service('encryption')->decrypt($user->get('field_encrypted_profile')->value) ]; $export_data[] = $export_row; } // 生成明文CSV文件 $fp = fopen('users_decrypted.csv', 'w'); fputcsv($fp, array_keys($export_data[0])); // 写入表头 foreach ($export_data as $row) { fputcsv($fp, $row); } fclose($fp); // 节点数据可复用类似逻辑,替换为\Drupal\node\Entity\Node::loadMultiple()
- 命令行运行脚本:
php decrypt_export.php,生成的CSV可直接用于自定义站点。
数据库透明加密的处理方法
- 在原Drupal环境用
mysqldump导出数据:原环境数据库客户端已配置解密权限,导出的SQL文件为明文。命令示例:
mysqldump -u [数据库用户名] -p [Drupal数据库名] > drupal_data_plain.sql
- 将导出的SQL文件导入自定义站点的数据库,即可直接读取明文数据。
图片数据处理
- Drupal图片默认存储在
sites/default/files目录,自定义站点可直接读取该目录文件;也可将文件复制到新站点存储目录,同步更新数据库内的文件路径字段。
注意事项
- 妥善保管解密密钥,避免泄露。
- 导出后随机抽查数据,确认解密结果正确。
- 自定义字段加密需对应调整脚本内的字段名称与解密逻辑。
内容的提问来源于stack exchange,提问作者josephgut
相关产品推荐
相关产品推荐

