MySQL structure.sql
의 불일치는 주로 AUTO_INCREMENT
값의 데이터 의존성, mysqldump
와 mariadb-dump
같은 클라이언트 간 출력 형식 차이, 그리고 MySQL/MariaDB 버전별로 다르게 출력되는 /*!...*/
형태의 실행 가능한 주석에서 비롯됩니다.
이 문제들을 해결하기 위해, Rails의 db:schema:dump
Rake 태스크를 enhance
하여 structure.sql
파일을 후처리하는 스크립트가 제안됩니다. 이 스크립트는 lib/tasks/db/schema/dump.rake
에 정의되며, bundle exec rails db:schema:dump
실행 시 작동합니다.
ruby
# lib/tasks/db/schema/dump.rake
Rake::Task['db:schema:dump'].enhance do
structure_sql_path = Rails.root.join('db/structure.sql')
if File.exist?(structure_sql_path)
sql = File.read(structure_sql_path)
sql.gsub!(/ AUTO_INCREMENT=[0-9]+/, '') # AUTO_INCREMENT 값 제거
sql.gsub!(/^.+enable the sandbox mode.+$\R/, '') # MariaDB 샌드박스 모드 주석 제거
sql.gsub!('/*!40101 SET NAMES utf8mb4 */;', '/*!50503 SET NAMES utf8mb4 */;') # 실행 가능한 주석 정규화
sql.gsub!('/*!40101 SET character_set_client = utf8mb4 */;', '/*!50503 SET character_set_client = utf8mb4 */;')
File.write(structure_sql_path, sql)
end
end
스크립트는 AUTO_INCREMENT
값을 제거하고, MariaDB 특정 샌드박스 모드 주석을 제거하며, MySQL과 MariaDB의 버전별 실행 가능한 주석(SET NAMES
, SET character_set_client
)을 MySQL 출력 형식에 맞춰 정규화합니다. 이 정규화를 통해 데이터 의존성 및 클라이언트/버전별 출력 차이를 해소하여 일관된 스키마 덤프를 보장합니다.