Database Maintenance

The site is powered by two databases. Anyone attempting an operation on the database should read and understand the respective database documentation before attempting any live changes and should attempt the changes on the virtual machine before running them on the live database.

A MySQL backend ( MySQL documentation) is responsible for the content management portion of the site. this database houses the articles, users, projects, accidents, store content, and forums. The database is backed up once a day currently.

Postgresql ( Postgresql documentation) is responsible for river information, gauge information, and photos. This database is backed up on a daily basis and most of the content that is editable by users is designed to be recoverable by a database administrator.

The Databases

The site runs with two databases currently.

  • The Mysql database, under wh2o, contains most of our production data. It is located on the production server.
  • The Postgresql database, under wh2o, contains most of the gauge and river information and is located on the database server.

Database Connectivity

The production website connects to the mySQL database locally and credentials traditionally. The MySQL database does not bind any TCP/IP ports.

The website connects to the postgresql database via an SSH tunnel to the database server which is maintained by xinetd. The website credentials traditionally in the firewall restricts incoming connections on the postgresql port to the website machine.

Database Backups

MySQL is backed up nightly to the production server into the directory /home/var/mysqldump. From there it is picked up by the backup process and moved to an offsite FTP server with a 14 day differential backup.

Postgresql is backed up nightly to the database server into the directory /home/site/pgdump. From that directory the content portion which includes user-entered data is picked up by the backup process and moved to an offsite FTP server with a 14 day differential backup. The historical data which includes gauge histories is moved to an offsite FTP site on a daily basis with no differential due to its size.

Database Repairs

Since 2005 the databases have been free of corruption due to a combination of improvements from the database vendors, stability improvements in the operating systems, and a stable production environment.

MySQL databases had previously had problems with corrupt tables which can be fixed with the MySQL repair tools. MySQL has also suffered from upgrade glitches which require the use of the MySQL upgrade script. The only other problem that we have had with MySQL is permissions issues relating to stored procedures. When restoring stored procedures and tables, and is important that the logged in user be the same user as the website uses. MySQL upgrades should be tested on the virtual machine before they're pushed out to the production servers so that potential problems can be anticipated.

Posgresql has been relatively stable. The big issue with Postgresql has been performance. Queries need to be tested under real-world conditions due to the fickle query optimizer.

Join AW and support river stewardship nationwide!
7.4.3PHP Version481msRequest Duration6MBMemory UsageGET content/{url}Route
    • Booting (40.03ms)
    • Application (441ms)
    • 1 x Application (91.68%)
      441ms
      1 x Booting (8.32%)
      40.03ms
      14 templates were rendered
      • legacy.views.container-view (resources/views/legacy/views/container-view.blade.php)6blade
        Params
        0
        components
        1
        controls
        2
        id
        3
        class
        4
        title
        5
        formRenderService
      • legacy.views.container-view (resources/views/legacy/views/container-view.blade.php)6blade
        Params
        0
        components
        1
        controls
        2
        id
        3
        class
        4
        title
        5
        formRenderService
      • app::layout.gadget (resources/views/layout/gadget.blade.php)2blade
        Params
        0
        contents
        1
        formRenderService
      • layout.columnstyle.one (resources/views/layout/columnstyle/one.blade.php)7blade
        Params
        0
        obLevel
        1
        __env
        2
        app
        3
        errors
        4
        contents
        5
        formRenderService
        6
        layout
      • layout.columnstyle.componentstack (resources/views/layout/columnstyle/componentstack.blade.php)9blade
        Params
        0
        obLevel
        1
        __env
        2
        app
        3
        errors
        4
        contents
        5
        formRenderService
        6
        layout
        7
        stack
        8
        component
      • layout.main (resources/views/layout/main.blade.php)7blade
        Params
        0
        obLevel
        1
        __env
        2
        app
        3
        errors
        4
        contents
        5
        formRenderService
        6
        layout
      • layout._headers (resources/views/layout/_headers.blade.php)7blade
        Params
        0
        obLevel
        1
        __env
        2
        app
        3
        errors
        4
        contents
        5
        formRenderService
        6
        layout
      • layout.header (resources/views/layout/header.blade.php)7blade
        Params
        0
        obLevel
        1
        __env
        2
        app
        3
        errors
        4
        contents
        5
        formRenderService
        6
        layout
      • layout._scripts (resources/views/layout/_scripts.blade.php)7blade
        Params
        0
        obLevel
        1
        __env
        2
        app
        3
        errors
        4
        contents
        5
        formRenderService
        6
        layout
      • layout.navigation (resources/views/layout/navigation.blade.php)8blade
        Params
        0
        obLevel
        1
        __env
        2
        app
        3
        errors
        4
        contents
        5
        formRenderService
        6
        layout
        7
        menu
      • includes.alert.membership (resources/views/includes/alert/membership.blade.php)17blade
        Params
        0
        obLevel
        1
        __env
        2
        app
        3
        errors
        4
        contents
        5
        formRenderService
        6
        layout
        7
        menu
        8
        searchurl
        9
        loginurl
        10
        logouturl
        11
        __currentLoopData
        12
        child
        13
        loop
        14
        otherchild
        15
        shouldNotifyUser
        16
        user
      • navigation.menu.static (resources/views/navigation/menu/static.blade.php)15blade
        Params
        0
        obLevel
        1
        __env
        2
        app
        3
        errors
        4
        contents
        5
        formRenderService
        6
        layout
        7
        menu
        8
        searchurl
        9
        loginurl
        10
        logouturl
        11
        __currentLoopData
        12
        child
        13
        loop
        14
        otherchild
      • includes.footer (resources/views/includes/footer.blade.php)8blade
        Params
        0
        obLevel
        1
        __env
        2
        app
        3
        errors
        4
        contents
        5
        formRenderService
        6
        layout
        7
        menu
      • layout.pagemap (resources/views/layout/pagemap.blade.php)7blade
        Params
        0
        obLevel
        1
        __env
        2
        app
        3
        errors
        4
        contents
        5
        formRenderService
        6
        layout
      uri
      GET content/{url}
      middleware
      web
      controller
      App\Http\Controllers\Wh2oController@content
      namespace
      App\Http\Controllers
      where
      as
      generated::Os9R4mqMKRF5ktoI
      file
      app/Http/Controllers/Wh2oController.php:34-68
      5 statements were executed, 4 of which were duplicated, 1 unique6.81ms
      • select * from "articles" where ("id" = '-SecurityGadget-explain' or "short_name" = '-SecurityGadget-explain') and "articles"."deleted_at" is null and "articles"."is_final" = 'true' limit 1
        760μs/app/Legacy/Repositories/NewsInfo.php:61wh2o
        Metadata
        Bindings
        • 0. -SecurityGadget-explain
        • 1. -SecurityGadget-explain
        • 2. true
        Backtrace
        • 15. /app/Legacy/Repositories/NewsInfo.php:61
        • 16. /code/wh2o/ArticleGadget.inc:128
        • 17. /code/wh2o/Page1.inc:930
        • 18. /code/wh2o/Page1.inc:1019
        • 19. /code/wh2o/SecurityGadget.inc:150
      • select * from "articles" where "short_name" = '-SecurityGadget-explain' limit 1
        2ms/app/Legacy/Repositories/NewsInfo.php:64wh2o
        Metadata
        Bindings
        • 0. -SecurityGadget-explain
        Backtrace
        • 15. /app/Legacy/Repositories/NewsInfo.php:64
        • 16. /code/wh2o/ArticleGadget.inc:128
        • 17. /code/wh2o/Page1.inc:930
        • 18. /code/wh2o/Page1.inc:1019
        • 19. /code/wh2o/SecurityGadget.inc:150
      • select * from "articles" where ("id" = '-SecurityGadget-explain' or "short_name" = '-SecurityGadget-explain') and "articles"."deleted_at" is null and "articles"."is_final" = 'true' limit 1
        1.53ms/app/Legacy/Repositories/NewsInfo.php:61wh2o
        Metadata
        Bindings
        • 0. -SecurityGadget-explain
        • 1. -SecurityGadget-explain
        • 2. true
        Backtrace
        • 15. /app/Legacy/Repositories/NewsInfo.php:61
        • 16. /code/wh2o/ArticleGadget.inc:128
        • 17. /code/wh2o/Page1.inc:930
        • 18. /code/wh2o/Page1.inc:1019
        • 19. /code/wh2o/SecurityGadget.inc:150
      • select * from "articles" where "short_name" = '-SecurityGadget-explain' limit 1
        2.39ms/app/Legacy/Repositories/NewsInfo.php:64wh2o
        Metadata
        Bindings
        • 0. -SecurityGadget-explain
        Backtrace
        • 15. /app/Legacy/Repositories/NewsInfo.php:64
        • 16. /code/wh2o/ArticleGadget.inc:128
        • 17. /code/wh2o/Page1.inc:930
        • 18. /code/wh2o/Page1.inc:1019
        • 19. /code/wh2o/SecurityGadget.inc:150
      • select * from security where domain in ('WelcomeGadget') and area is null;
        132μs/vendor/laravel/framework/src/Illuminate/Foundation/helpers.php:476legacy db
        Metadata
        Backtrace
        • 4. /vendor/laravel/framework/src/Illuminate/Foundation/helpers.php:476
        • 6. /app/Legacy/Repositories/InfoADO.php:368
        • 7. /app/Legacy/Repositories/InfoADO.php:391
        • 8. /app/Legacy/Repositories/SecurityInfo.php:188
        • 9. /app/Legacy/Security/BaseSecurity.php:143
          _token
          Lwpro2NMv8aV9vc7rNdt8GY2nRvsTydgGWbiNHA7
          page
          array:1 [ "count" => -1 ]
          PHPDEBUGBAR_STACK_DATA
          []
          path_info
          /content/Wiki/developer:database_maintenance
          status_code
          200
          
          status_text
          OK
          format
          html
          content_type
          text/html; charset=UTF-8
          request_query
          []
          
          request_request
          []
          
          request_headers
          0 of 0
          array:15 [ "priority" => array:1 [ 0 => "u=0, i" ] "accept-encoding" => array:1 [ 0 => "gzip, deflate, br, zstd" ] "sec-fetch-dest" => array:1 [ 0 => "document" ] "sec-fetch-user" => array:1 [ 0 => "?1" ] "sec-fetch-mode" => array:1 [ 0 => "navigate" ] "sec-fetch-site" => array:1 [ 0 => "none" ] "accept" => array:1 [ 0 => "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7" ] "user-agent" => array:1 [ 0 => "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)" ] "upgrade-insecure-requests" => array:1 [ 0 => "1" ] "sec-ch-ua-platform" => array:1 [ 0 => ""Windows"" ] "sec-ch-ua-mobile" => array:1 [ 0 => "?0" ] "sec-ch-ua" => array:1 [ 0 => ""HeadlessChrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"" ] "cache-control" => array:1 [ 0 => "no-cache" ] "pragma" => array:1 [ 0 => "no-cache" ] "host" => array:1 [ 0 => "beta.americanwhitewater.org" ] ]
          request_server
          0 of 0
          array:42 [ "USER" => "www-data" "HOME" => "/var/www" "HTTP_PRIORITY" => "u=0, i" "HTTP_ACCEPT_ENCODING" => "gzip, deflate, br, zstd" "HTTP_SEC_FETCH_DEST" => "document" "HTTP_SEC_FETCH_USER" => "?1" "HTTP_SEC_FETCH_MODE" => "navigate" "HTTP_SEC_FETCH_SITE" => "none" "HTTP_ACCEPT" => "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7" "HTTP_USER_AGENT" => "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)" "HTTP_UPGRADE_INSECURE_REQUESTS" => "1" "HTTP_SEC_CH_UA_PLATFORM" => ""Windows"" "HTTP_SEC_CH_UA_MOBILE" => "?0" "HTTP_SEC_CH_UA" => ""HeadlessChrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"" "HTTP_CACHE_CONTROL" => "no-cache" "HTTP_PRAGMA" => "no-cache" "HTTP_HOST" => "beta.americanwhitewater.org" "REDIRECT_STATUS" => "200" "SERVER_NAME" => "beta.americanwhitewater.org" "SERVER_PORT" => "443" "SERVER_ADDR" => "172.31.18.125" "REMOTE_PORT" => "55004" "REMOTE_ADDR" => "18.119.139.161" "SERVER_SOFTWARE" => "nginx/1.18.0" "GATEWAY_INTERFACE" => "CGI/1.1" "HTTPS" => true "REQUEST_SCHEME" => "https" "SERVER_PROTOCOL" => "HTTP/2.0" "DOCUMENT_ROOT" => "/opt/americanwhitewater.org/public" "DOCUMENT_URI" => "/index.php" "REQUEST_URI" => "/content/Wiki/developer:database_maintenance" "SCRIPT_NAME" => "/index.php" "CONTENT_LENGTH" => "" "CONTENT_TYPE" => "" "REQUEST_METHOD" => "GET" "QUERY_STRING" => "" "PHP_VALUE" => "post_max_size=20M" "SCRIPT_FILENAME" => "/opt/americanwhitewater.org/public/index.php" "FCGI_ROLE" => "RESPONDER" "PHP_SELF" => "/index.php" "REQUEST_TIME_FLOAT" => 1743830379.0187 "REQUEST_TIME" => 1743830379 ]
          request_cookies
          []
          
          response_headers
          0 of 0
          array:5 [ "content-type" => array:1 [ 0 => "text/html; charset=UTF-8" ] "cache-control" => array:1 [ 0 => "no-cache, private" ] "date" => array:1 [ 0 => "Sat, 05 Apr 2025 05:19:39 GMT" ] "set-cookie" => array:2 [ 0 => "XSRF-TOKEN=eyJpdiI6IlEwdy9ZdjFvejZPdGpwMUt0dVRFUmc9PSIsInZhbHVlIjoiZXFrN29vZENWSkxhbVNSQmFROTk1WXkvZWwvcmdWTXFsTHFRMmRZeGRMeElJcExkdFVoUzFib01ENTh0YnlEcVJJWjZpVS8zemxad3M2aFVMS1BXNzRYUm12dUN2dHNIc3BKNU9STEoxWVp0RnJYY3Q4Z0cwcm9tTW9YNUJ0OEwiLCJtYWMiOiIyZWEyM2E2OTViZThjMTQwYzg4ZDQ0YjA4OTIxMzdhY2E5ZjBhNDFkMTJlYWJhNWIzYWM3ZmYwYzAyMmQ1ZmQ3In0%3D; expires=Sat, 05-Apr-2025 07:19:39 GMT; Max-Age=7200; path=/XSRF-TOKEN=eyJpdiI6IlEwdy9ZdjFvejZPdGpwMUt0dVRFUmc9PSIsInZhbHVlIjoiZXFrN29vZENWSkxhbVNSQmFROTk1WXkvZWwvcmdWTXFsTHFRMmRZeGRMeElJcExkdFVoUzFib01ENTh0YnlEcVJJWjZpV" 1 => "DWa976077ab53ea1a0f12b663e732b73c0=eyJpdiI6InVjdGlnK3pGYzRsdzVKeWdsRFhFd0E9PSIsInZhbHVlIjoiWnR3SWZkSkNSVHowNmVDajVVNHhJY0hEL3JGZTE1Wi83WE9sQjF1bE1PTDdkMExycjM3QVZoN2V4Y3ZpOEJGSyIsIm1hYyI6ImUxYzVkZjBiNThmYzRkYmI2ODVjNDBjMTM0ZGIyNjQ4MGIyMjNhZmUxZmYzMDE1NDNkZTRiYzNhMTBlNTI3NmQifQ%3D%3D; expires=Sat, 05-Apr-2025 05:18:39 GMT; Max-Age=0; path=/; httponlyDWa976077ab53ea1a0f12b663e732b73c0=eyJpdiI6InVjdGlnK3pGYzRsdzVKeWdsRFhFd0E9PSIsInZhbHVlIjoiWnR3SWZkSkNSVHowNmVDajVVNHhJY0hEL3JGZTE1Wi83WE9sQjF1bE1PTDdkMExycjM3Q" ] "Set-Cookie" => array:2 [ 0 => "XSRF-TOKEN=eyJpdiI6IlEwdy9ZdjFvejZPdGpwMUt0dVRFUmc9PSIsInZhbHVlIjoiZXFrN29vZENWSkxhbVNSQmFROTk1WXkvZWwvcmdWTXFsTHFRMmRZeGRMeElJcExkdFVoUzFib01ENTh0YnlEcVJJWjZpVS8zemxad3M2aFVMS1BXNzRYUm12dUN2dHNIc3BKNU9STEoxWVp0RnJYY3Q4Z0cwcm9tTW9YNUJ0OEwiLCJtYWMiOiIyZWEyM2E2OTViZThjMTQwYzg4ZDQ0YjA4OTIxMzdhY2E5ZjBhNDFkMTJlYWJhNWIzYWM3ZmYwYzAyMmQ1ZmQ3In0%3D; expires=Sat, 05-Apr-2025 07:19:39 GMT; path=/XSRF-TOKEN=eyJpdiI6IlEwdy9ZdjFvejZPdGpwMUt0dVRFUmc9PSIsInZhbHVlIjoiZXFrN29vZENWSkxhbVNSQmFROTk1WXkvZWwvcmdWTXFsTHFRMmRZeGRMeElJcExkdFVoUzFib01ENTh0YnlEcVJJWjZpV" 1 => "DWa976077ab53ea1a0f12b663e732b73c0=eyJpdiI6InVjdGlnK3pGYzRsdzVKeWdsRFhFd0E9PSIsInZhbHVlIjoiWnR3SWZkSkNSVHowNmVDajVVNHhJY0hEL3JGZTE1Wi83WE9sQjF1bE1PTDdkMExycjM3QVZoN2V4Y3ZpOEJGSyIsIm1hYyI6ImUxYzVkZjBiNThmYzRkYmI2ODVjNDBjMTM0ZGIyNjQ4MGIyMjNhZmUxZmYzMDE1NDNkZTRiYzNhMTBlNTI3NmQifQ%3D%3D; expires=Sat, 05-Apr-2025 05:18:39 GMT; path=/; httponlyDWa976077ab53ea1a0f12b663e732b73c0=eyJpdiI6InVjdGlnK3pGYzRsdzVKeWdsRFhFd0E9PSIsInZhbHVlIjoiWnR3SWZkSkNSVHowNmVDajVVNHhJY0hEL3JGZTE1Wi83WE9sQjF1bE1PTDdkMExycjM3Q" ] ]
          session_attributes
          0 of 0
          array:3 [ "_token" => "Lwpro2NMv8aV9vc7rNdt8GY2nRvsTydgGWbiNHA7" "page" => array:1 [ "count" => -1 ] "PHPDEBUGBAR_STACK_DATA" => [] ]