1
0

remote_lock_free_indexes.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import os
  2. import sys
  3. import paramiko
  4. import dotenv
  5. import time
  6. sys.stdout.reconfigure(encoding='utf-8')
  7. sys.stderr.reconfigure(encoding='utf-8')
  8. repo_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  9. dotenv.load_dotenv(dotenv_path=os.path.join(repo_root, ".env"))
  10. host = os.environ.get('SERVER_HOST')
  11. user = os.environ.get('SERVER_USER')
  12. password = os.environ.get('SERVER_PASS')
  13. if password == "your_db_password_here" or not password:
  14. password = None
  15. ssh = paramiko.SSHClient()
  16. ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  17. try:
  18. ssh.connect(host, username=user, password=password, timeout=10)
  19. print("SSH Connected!")
  20. # 1. Stop app container to release all locks
  21. print("Stopping app container...")
  22. stdin, stdout, stderr = ssh.exec_command("cd food_project && docker-compose stop app")
  23. stdout.read()
  24. # 2. Restart MySQL to drop any blocked index creation queries
  25. print("Restarting MySQL...")
  26. stdin, stdout, stderr = ssh.exec_command("cd food_project && docker-compose restart mysql")
  27. stdout.read()
  28. print("Waiting 10 seconds for MySQL to be healthy...")
  29. time.sleep(10)
  30. # 3. Create full-text indexes
  31. queries = [
  32. "ALTER TABLE food_db.products_core ADD FULLTEXT INDEX idx_prod_ing (product_name, ingredients_text);",
  33. "ALTER TABLE food_db.products_core ADD FULLTEXT INDEX idx_prod_name (product_name);",
  34. "ALTER TABLE food_db.products_core ADD FULLTEXT INDEX idx_ing_text (ingredients_text);"
  35. ]
  36. db_pass = os.environ.get('MYSQL_ROOT_PASSWORD') or 'your_mysql_root_pass'
  37. for q in queries:
  38. print(f"Executing: {q}")
  39. cmd = f"docker exec food_project-mysql-1 mysql -uroot -p{db_pass} -e '{q}'"
  40. stdin, stdout, stderr = ssh.exec_command(cmd)
  41. print("STDOUT:\n", stdout.read().decode('utf-8'))
  42. print("STDERR:\n", stderr.read().decode('utf-8'))
  43. # 4. Start app container back up
  44. print("Starting app container...")
  45. stdin, stdout, stderr = ssh.exec_command("cd food_project && docker-compose start app")
  46. stdout.read()
  47. print("Index creation completed successfully!")
  48. except Exception as e:
  49. print(f"Error: {e}")
  50. finally:
  51. ssh.close()